提问



Android Studio 0.4.5


用于创建自定义对话框的Android文档:http://developer.android.com/guide/topics/ui/dialogs.html [84]


如果需要自定义对话框,则可以将Activity显示为对话框而不是使用对话框API。只需创建一个Activity并将其主题设置为Theme.Holo.Dialog in
<activity>清单元素:


<activity android:theme="@android:style/Theme.Holo.Dialog" >


但是,当我尝试这个时,我得到以下异常:


java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity


我支持以下内容,我不能使用大于10的内容:


minSdkVersion 10
targetSdkVersion 19


在我的风格中,我有以下几点:


<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">


在我的清单中,我有这个Activity:


 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:theme="@android:style/Theme.Holo.Light.Dialog"
            android:name="com.ssd.register.Dialog_update"
            android:label="@string/title_activity_dialog_update" >
        </activity>


像我这样创建对话框是我要完成的事情,因为我已经完成了布局。


谁能告诉我如何解决这个问题?

最佳参考


您遇到此问题的原因是因为您尝试应用对话框主题的Activity正在扩展ActionBarActivity,这需要应用AppCompat主题。


更新:扩展AppCompatActivity也会出现此问题


在这种情况下,将Java继承从ActionBarActivity更改为Activity,并将对话框主题保留在清单中,非Theme.AppCompat





一般规则是,如果您希望您的代码支持旧版本的Android,它应该具有AppCompat主题,并且Java代码应该扩展AppCompatActivity。如果您有一项不需要此支持的Activity,例如您只关心Android的最新版本和功能,您可以应用任何主题,但java代码必须扩展旧的Activity





注意:当从AppCompatActivity(或子类,ActionBarActivity)更改为Activity时,还必须将带有支持的各种呼叫更改为相应的呼叫,无需支持。所以,不要getSupportFragmentManager,而是getFragmentManager

其它参考1


您需要做的就是将android:theme="@style/Theme.AppCompat.Light"添加到AndroidManifest.xml文件中的应用程序标签中。

其它参考2


在上面的评论中从@MarkKeen复制答案,因为我遇到了同样的问题。


我在帖子顶部说明了错误,并在我添加了一个警告对话框后发生了。我在清单中有所有相关的样式信息。通过更改警报生成器中的上下文引用来解决我的问题 - 我更改了:


new android.support.v7.app.AlertDialog.Builder(getApplicationContext())


至:


new android.support.v7.app.AlertDialog.Builder(this)


没有更多的问题。

其它参考3


min sdk是10. ActionBar可从api级别11获得。因此,对于10,您将使用Theme.AppCompat来自支持库,您需要使用Theme.AppCompat或其后代。


使用


android:theme="@style/Theme.AppCompat" >


或者,如果你不想在顶部的动作栏


android:theme="@style/Theme.AppCompat.NoActionBar">


更多信息 @


http://developer.android.com/guide/topics/ui/actionbar.html[85]


编辑:


我可能误读了op post。


似乎操作需要具有Activity主题的Dialog。正如Bobbake4已经建议的那样Activity而不是ActionBarActivity


还可以在下面的链接中查看@ Dialog Attributes


http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/frameworks/base/core/res/res/values/themes.xml/[86]

其它参考4


这对我有用,我刚改变了:


final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());


对此:


final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

其它参考5


我遇到了这个问题,即使我的主题是AppCompat主题,我的Activity是AppCompatActivity(或Activity,正如其他答案所建议的那样。所以我清理,重建和重新运行该项目。


(构建 - >清理项目;构建 - >重建项目;运行 - >运行)


看似愚蠢,但现在效果很好!


希望它有所帮助!

其它参考6


这就是为我解决的问题:我没有在manifest中指定主题,而是在onCreate中为每个扩展ActionBarActivity的Activity定义了它:


@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.MyAppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity_layout);
...
}


这里MyAppThemeTheme.AppCompat的后代,并以xml定义。请注意,必须在super.onCreatesetContentView之前设置主题。

其它参考7


转到你的风格并把父


parent="Theme.AppCompat"


代替


parent="@android:style/Theme.Holo.Light"

其它参考8


在我的情况下,我的res目录中没有values-v21文件。然后我创建它并在其中添加以下代码:


  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

其它参考9


如果需要在style.xml上扩展ActionBarActivity:


<!-- Base application theme. -->
<style name="AppTheme" parent="AppTheme.Base"/>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->


如果您将应用程序的主题设置为android:Theme.Material.Light而不是 AppTheme.Base ,那么您将获得IllegalStateException:您需要使用Theme.AppCompat主题(或后代) )与此Activity错误。

其它参考10


我有同样的问题,但当我把它放在清单上时它解决了:android:theme =@ style/Theme.AppCompat。


    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name_test"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat">

        ...    

    </application>

其它参考11


更改所需Activity的主题。这对我有用:


<activity
            android:name="HomeActivity"
            android:screenOrientation="landscape"
            android:theme="@style/Theme.AppCompat.Light"
            android:windowSoftInputMode="stateHidden" />

其它参考12


我在三星设备上遇到了这样的崩溃,即使该Activity确实使用了 Theme.AppCompat 。
根本原因与三星方面的奇怪优化有关:


- if one activity of your app has theme not inherited from Theme.AppCompat
- and it has also `android:launchMode="singleTask"`
- then all the activities that are launched from it will share the same Theme


我的解决方案只是删除android:launchMode="singleTask"

其它参考13


对我来说是使用ContextThemeWrapper的解决方案:


private FloatingActionButton getFAB() {
Context context = new android.support.v7.view.ContextThemeWrapper(getContext(), R.style.AppTheme);
FloatingActionButton fab = new FloatingActionButton(context);
return fab;}


来自Android - 如何以编程方式创建FAB?

其它参考14


你有很多解决这个错误的方法。



  1. 您应该使用Activity或 FragmentActivity 而不是 ActionbarActivity 或 AppCompatActivity

  2. 如果您要使用 ActionbarActivity 或 AppCompatActivity ,则应更改 styles.xml Theme.Holo.xxxx 到 Theme.AppCompat.Light (如有必要,添加到 DarkActionbar )



如果您不需要有关操作栏或 AppCompat 的高级属性,则无需使用 Actionbar 或 AppCompat 。

其它参考15


在Android清单中,只需将Activity主题更改为AppTheme,如下面的代码片段


<activity
  android:name=".MainActivity"
  android:label="@string/app_name"
  android:theme="@style/AppTheme">
</activity>

其它参考16


这是在片段中需要AlertDialog的时候


            AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
            adb.setTitle("My alert Dialogue \n");
            adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                  //some code

            } });
            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                 dialog.dismiss();

                } });
            adb.show();

其它参考17


我也有这个问题以及我做了什么来修复它,并且仍然使用Holo主题是采取以下步骤:


首先我替换了这个导入:


import android.support.v7.app.AppCompatActivity;


与这一个:


import android.app.Activity;


然后改变我的扩展名:


public class MyClass extends AppCompatActivity {//...


对此:


public class MyClass extends Activity {//...


并且还必须更改此导入:


import android.support.v7.app.AlertDialog;


到这个导入:


import android.app.AlertDialog;


然后您可以在Activity级别的清单中使用您的主题标记:


android:theme="@android:style/Theme.Holo.Dialog" />


最后,(除非您的项目中有其他类必须使用v7 appCompat),您可以清理并重建项目,也可以在应用程序级别的gradle构建文件中删除此条目:


compile 'com.android.support:appcompat-v7:23.2.1'


如果您的项目中有其他类必须使用v7 appCompat,那么只需清理并重建项目即可。

其它参考18


你之所以这样,是因为你想在以前的sdk版本中将主题样式中的Material Design应用到21 ActionBarActivity需要AppTheme所以如果你还想阻止你自己定制你的AppTheme,那么只有你必须在styles.xml中更改(在sdk 21之前),所以这样,可以继承App Compat主题。


<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">


为了这:


<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

其它参考19


将您的主题样式父级更改为


 parent="Theme.AppCompat"


这对我有用......

其它参考20


这个对我有用:


<application
           android:allowBackup="true"
           android:icon="@mipmap/ic_launcher"
           android:label="@string/app_name"
           android:theme="@style/AppTheme" >
           <activity
               android:name=".MainActivity"
               android:label="@string/app_name"
               android:theme="@style/Theme.AppCompat.NoActionBar">

               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />

                   <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
           </activity>
</application>

其它参考21


您的Activity正在扩展 ActionBarActivity ,需要应用 AppCompat.theme
ActionBarActivity 更改为Activity FragmentActivity ,它将解决问题。



  如果您不使用操作栏,则:



android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 

其它参考22


快速解决方案


在styles.xml中更改基本主题父级


替换


<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">





<style name="AppTheme" parent="Theme.AppCompat">

其它参考23


根据我的经验,问题是我展示对话框的背景。
在按钮内单击我以这种方式实例化AlertDialog:


builder = new AlertDialog.Builder(getApplicationContext());


但上下文不正确并导致错误。我用这种方式使用应用程序上下文改变了它:


在声明部分:


Context mContext;


在onCreate方法中


mContext = this;


最后在我需要AlertDialog的代码中:


start_stop = (Button) findViewById(R.id.start_stop);
start_stop.setOnClickListener( new View.OnClickListener()
     {
                @Override
                public void onClick(View v)
                {
                    if (!is_running)
                    {
                        builder = new AlertDialog.Builder(mContext);
                        builder.setMessage("MYTEXT")
                                .setCancelable(false)
                                .setPositiveButton("SI", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                    Task_Started = false;
                                    startTask();
                                    }
                                })
                                .setNegativeButton("NO",
                                        new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();
                    }
            }
        }


这是我的解决方案。

其它参考24


做就是了


new AlertDialog.Builder(this)


代替


new AlertDialog.Builder(getApplicationContext())

其它参考25


这个解决方案对我有用。


设计库依赖于Support v4和AppCompat支持库,因此不要在gradle中为appcompat和设计库使用不同的版本。


使用


 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.0.0'


代替


 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.1.0'

其它参考26


我遇到了同样的问题。因为我正在创建自定义导航抽屉。但我忘记在我的清单中提到这样的主题


机器人:主题= @风格/Theme.AppCompat.NoActionBar


一旦我将上面的主题添加到我的清单中,它解决了问题。

其它参考27


对我来说,即使我Theme.AppCompat作为我的应用程序的基本主题,上述答案都没有奏效。我正在使用com.android.support:design:24.1.0所以我只是将版本更改为24.1.1。在gradle sync之后,它再次工作,异常消失了。在我看来,问题在于一些旧版本的设计支持库。


把这个放在这里以防其他答案对某些人不起作用。

其它参考28


在我的例子中,我用ApplicationContext来扩展视图。当您使用ApplicationContext时,未应用主题/样式,因此虽然我的样式中有Theme.Appcompat,但它未应用并导致此异常。更多细节:当inflater与ApplicationContext 一起使用时,不应用主题/样式

其它参考29


我的Activity与SectionsPagerAdapter和ViewPager&分段


public class MyActivity extends AppCompatActivity implements ActionBar.TabListener
...
...
     @Override
        public void onPostResume(){
            super.onPostResume();
            try {
               getSupportActionBar().setDisplayShowTitleEnabled(false);
            }catch (NullPointerException ignored){
            }
        }