【问题标题】:You need to use a Theme.AppCompat theme (or descendant) with this activity您需要在此活动中使用 Theme.AppCompat 主题(或后代)
【发布时间】:2014-03-15 21:46:55
【问题描述】:

Android Studio 0.4.5

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

如果您想要自定义对话框,则可以将 Activity 显示为对话框,而不是使用对话框 API。只需创建一个活动并将其主题设置为 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">

在我的清单中,我有这个活动:

 <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>

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

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

【问题讨论】:

  • @Raghunandan,我是新手,但看看我的风格,我有以下几点:
  • 您正在使用AppCompat,它是支持库的形式,以支持低于 api 级别 11 的操作栏。只需将 android:theme="@style/AppTheme" &gt; 用于清单中的活动
  • @ant2009,澄清@Raghunandan 所说的内容:在您的AndroidManifest.xml 中,您为活动指定的主题将覆盖您为应用程序指定的主题。从&lt;activity&gt; 标记中删除android:theme 行。
  • 这样做会消除错误,但不会让他到达他想去的地方,这是一个带有对话主题的活动。一般规则是,如果您希望您的活动有一个操作栏,它应该有 AppCompat 主题,并且 java 代码应该扩展 ActionBarActivity。如果您有一个不需要操作栏的活动(如以对话框为主题的活动),您可以对其应用任何主题,但 Java 代码必须扩展普通的旧活动。
  • 我认为在这种情况下唯一的问题是您为 Dialog 构造器提供的上下文。看我的回答。 stackoverflow.com/a/51574281/232727

标签: android android-layout


【解决方案1】:

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

更新:扩展AppCompatActivity也会有这个问题

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


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


注意:当从AppCompatActivity(或子类ActionBarActivity)更改为Activity时,还必须将带有“支持”的各种调用更改为相应的调用没有“支持”。因此,请致电 getFragmentManager,而不是 getSupportFragmentManager

【讨论】:

  • op 正在使用 appcompat,在这种情况下,他应该扩展 ActionBarActivity,这从问题下方评论的导入语句中可以看出。
  • @Bursos 如果您说的是在 Android Studio 中创建新项目时,我猜这是标准配置中的错误。
  • @Bobbake4,我遇到了同样的问题,这个解决方案对我来说是不可能的。问题是我无法扩展 Activity,因为我有一堆依赖于 ActionBarActivity 的类(整个项目)。有没有其他解决方案?谢谢
  • @5er 如果您的 Java 使用 ActionBarActivity,则主题必须扩展 Theme.AppCompat。有一些内置主题确实扩展了 Theme.AppCompat 或者您可以自己扩展并修改它。如果不删除 ActionBarActivity 父级,您将无法使用 Theme.AppCompat。
  • 风格
【解决方案2】:

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

【讨论】:

  • 在代码中,ant2009 将 AppTheme 设置为从 Theme.AppCompat 的后代扩展而来的应用程序。那应该行得通。在我的设备上升级到 5.0 并最终将 @style/Theme.AppCompat.Light 设置为我的活动主题后,我遇到了同样的问题。有什么不在这里...
  • 这不是 Android Studio 的有效答案,尽管在某些情况下它可以作为绕过 styles.xml 文件的快速修复。在 Android Studio 中,定义主题的正确方法是在 styles.xml 文件中定义它们,然后 Android 清单文件将仅引用它们,并根据您在设备上运行的 Android 版本选择它们。通常它设置为 android:theme="@style/AppTheme" 并且这个 AppTheme 是指 style.xml 中的
  • 这对我来说真的不起作用,因为当我使用全息以外的任何东西时,我的标题栏消失了......
  • 使用 SnackBar 也遇到了这个问题。这解决了我的问题。
  • @Martin 如果你和我一样,你忘记在通用文件 styles.xml 中添加与在(V21)styles.xml 文件中添加相同的样式名称(没有特定于 V21 的属性) .如果您在 V21 文件夹中声明样式并且您的设备具有以下版本。它找不到它,因此引发了异常。
【解决方案3】:

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

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

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

到:

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

没有更多的问题。

【讨论】:

  • 这也发生在我身上。我只是在尝试,您的回答确实有效!它起作用的逻辑是什么?我真的不明白。
  • 或者,如果您在片段中而不是直接在 Activity 中构建 AlertDialog,请使用 getActivity() 而不是 this,如上所述,问题已得到解决。至于为什么,我只能推测旧的 AlertDialog.Builder(xxx) 代码要么想要传入不同的类型,要么只是对传入的内容不那么挑剔,而当前的 Builder() 真的非常想要一个 Activity。由于 Google 选择隐藏(删除?)旧代码的文档,大概是为了鼓励使用 v7.app 版本,我无法确定。
  • 做了与建议相反的事情。它起作用了:P。谢谢!
  • 这为我解决了这个程序,如果你在 ArrayAdapter 或类似的适配器类中,你也可以使用 getContext() 而不是 this
  • 这是我见过的真正解决方案。提示:请在此目的中提及 getApplicationContext() 和 this 的区别。
【解决方案4】:

如果你使用的是应用上下文,像这样:

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

将其更改为这样的活动上下文:

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

【讨论】:

  • 如果您使用的是 LayoutInflater.from(),请确保使用活动上下文或提供的 LayoutInflater,以便它继承正确的主题。
  • 您的解决方案对我有帮助。你能解释一下 getApplicationContext() 和 MainActivity.this 有什么区别吗?
  • 您需要一个活动,而不是上下文来显示对话框
  • 那么到底为什么AlertDialog.Builder() 需要Context
【解决方案5】:

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

使用

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

或者,如果您不希望操作栏位于顶部

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

更多信息@

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

编辑:

我可能误读了操作帖。

似乎 op 想要一个带有活动主题的对话框。因此,正如 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/

【讨论】:

  • 感谢您的建议。我确实已经尝试过了。我遇到了同样的问题。我的样式文件如下所示:
  • @ant2009 你不会的。为您的活动使用支持库 AppCompat 中的主题
  • 我不确定我添加的这个主题是否正确。但是您的意思是添加以下导入语句吗?导入 android.support.v7.appcompat.*;但是,我确实尝试过,也许我错了,因为我仍然遇到了同样的异常。
  • @ant2009 你可以有一个自定义对话框。但是你想全屏对话吗?
  • 我不想让它全屏显示。只是一个对话框。不过,现在问题已经解决了。 Bobbake4 做对了。无论如何,感谢您的努力,您提供了有用的建议。但是,我仍然对所有这些支持库和 AppCompat 感到困惑。
【解决方案6】:

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

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

它可能看起来很愚蠢,但现在它效果很好

希望对你有所帮助!

【讨论】:

  • 在将 DialogFragment 添加到 AppCompat 活动后得到完全相同的消息。 File, Invalidate Caches / Restart 在紧要关头修复了这个问题。
  • 我在这个线程中尝试了几乎所有的答案。但只有这个看似“愚蠢”的答案才有效。谢谢!
  • 如有疑问,假设 Android Studio 已经悄悄地破坏了您的整个代码库并尝试重建。这对我有用。亲爱的上帝,我对 Android 的仇恨是无限的。
【解决方案7】:

这是为我解决的问题:我没有在清单中指定主题,而是在 onCreate 中为扩展 ActionBarActivity 的每个活动定义它:

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

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

【讨论】:

  • Robolectric 在尝试加载资源时在 setTheme 行抛出 NullPointerException。知道为什么吗?
  • @RhysDavis 很难说没有堆栈跟踪,但也许它首先要 setContentView ?在这种情况下,此修复对您不起作用。
【解决方案8】:

转到您的样式并放置父项

parent="Theme.AppCompat"

而不是

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

【讨论】:

  • 为什么我们可以通过标准活动来做到这一点。 Android 没有在带有 ICS 或 Honecomb 的标准活动上放置操作栏吗?如果我们将最小目标设置为 SDK ICS,我们是否总是必须使用 ActionBarActivity?
  • 如何查看我们应该使用哪个主题与我们正在使用的类型或功能,因为当我们导入时,我们有所有类型的主题可用
  • 谢谢。这个答案帮助了我。 :)
【解决方案9】:

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

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

【讨论】:

    【解决方案10】:

    在我的情况下,我的 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>
    

    【讨论】:

    • 我在 Oreo+ 设备上运行我的项目,只有这个对我有用。
    【解决方案11】:

    只是做

    new AlertDialog.Builder(this)
    

    代替

    new AlertDialog.Builder(getApplicationContext())
    

    【讨论】:

    • 工作解决方案! 30分钟找出这个答案。为什么我要使用 new AlertDialog.Builder(getApplicationContext())?
    • 这将有助于解释this 的预期类型。
    【解决方案12】:

    我在 Samsung 设备上遇到了这样的崩溃,即使该活动确实使用了 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"

    【讨论】:

    • 刚刚也遇到了这个问题,我还没有验证修复,也无法重现错误。但我只在三星设备上看到了这个错误。大多数似乎也扎根了,fwiw
    • 我在帖子顶部说明了错误,并且在我添加了一个警报对话框之后发生了。我在清单中有所有相关的样式信息。通过更改警报生成器中的上下文引用解决了我的问题 - 我将:new android.support.v7.app.AlertDialog.Builder(getApplicationContext()) 更改为:new android.support.v7.app.AlertDialog.Builder(this ),没有更多的问题......
    • 你有更多关于这个优化的细节或三星链接吗?那么所有活动都必须实现 Theme.AppCompat 还是可以有没有主题的活动?
    【解决方案13】:

    如果您需要在 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 主题(或后代)与此活动”错误。

    【讨论】:

      【解决方案14】:

      我有同样的问题,但是当我把它放在清单上时它解决了: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>
      

      【讨论】:

        【解决方案15】:

        对我来说,在尝试了这里的所有解决方案之后,解决方案是改变

            <activity
                android:name="com.github.cythara.MainActivity"
                android:label="Main">
            </activity>
        

        包含一个主题:

            <activity
                android:name="com.github.cythara.MainActivity"
                android:theme="@style/Theme.AppCompat.NoActionBar"
                android:label="Main">
            </activity>
        

        【讨论】:

        • @style/Theme.AppCompat.Light 如果您想保留操作栏,也可以使用。
        【解决方案16】:

        你来到这里是因为你想在你的主题风格中应用 Material Design 在之前的 sdk 版本到 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">
        

        【讨论】:

        • 做到了。还是有问题。所以还有更多。
        【解决方案17】:

        在我的情况下,当我尝试显示 Dialog 时出现了这样的问题。 问题出在上下文中,我使用了 getBaseContext(),它理论上应该返回 Activity 上下文,但似乎不是,或者它在应用任何主题之前返回上下文。

        所以我只是将 getBaseContexts() 替换为“this”,现在它按预期工作了。

                Dialog.showAlert(this, title, message,....);
        

        【讨论】:

        • 我通过了 getApplicaitonContext(),但你的成功了
        【解决方案18】:

        我有一个主题为 &lt;android:theme="@android:style/Theme.Dialog"&gt; 的活动,用于在我的 appWidget 中显示对话框,我遇到了同样的问题

        我通过更改活动代码解决了这个错误,如下所示:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            setTheme(R.style.Theme_AppCompat_Dialog); //this line i added
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_dialog);
        }
        

        【讨论】:

        • 这是一个直截了当的答案,对我有用,没有接受的答案的所有复杂性和非答案。
        【解决方案19】:

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

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

        来自Android - How to create FAB programmatically?

        【讨论】:

          【解决方案20】:

          我也遇到了这个问题,我做了什么来解决它,并且仍然使用 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;
          

          然后您可以在活动级别的清单中使用您的主题标签:

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

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

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

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

          【讨论】:

            【解决方案21】:

            确保在创建新警报对话框时使用的是活动上下文,而不是应用程序或基础上下文。

            【讨论】:

              【解决方案22】:

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

              1. 您应该使用 ActivityFragmentActivity 而不是 ActionbarActivityAppCompatActivity

              2. 如果你想使用 ActionbarActivityAppCompatActivity,你应该改变 styles.xml Theme.Holo.xxxx Theme.AppCompat.Light(如有必要,添加到 DarkActionbar

              如果您不需要关于操作栏或 AppCompat 的高级属性,则不需要使用 ActionbarAppCompat。 p>

              【讨论】:

                【解决方案23】:

                在 Android 清单中,只需将活动主题更改为 AppTheme,如下代码 sn-p

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

                【讨论】:

                【解决方案24】:

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

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

                我将上述主题添加到我的清单后,它就解决了问题。

                【讨论】:

                  【解决方案25】:

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

                   parent="Theme.AppCompat"
                  

                  这对我有用...

                  【讨论】:

                    【解决方案26】:

                    这个对我有用:

                    <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>
                    

                    【讨论】:

                      【解决方案27】:

                      您的 Activity 正在扩展 ActionBarActivity,这需要应用 AppCompat.theme。 把ActionBarActivity换成Activity或者FragmentActivity,问题就解决了。

                      如果你不使用操作栏,那么:

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

                      【讨论】:

                        【解决方案28】:

                        这是你想要一个片段中的 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();
                        

                        【讨论】:

                          【解决方案29】:

                          根据我的经验,问题在于我显示对话的上下文。 在按钮内单击我以这种方式实例化一个 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();
                                              }
                                      }
                                  }
                          

                          这就是我的解决方案。

                          【讨论】:

                          • 你是正确的,你不应该像原来那样使用应用程序上下文。您所做的是使用 Activity 作为上下文。然而,这不是应用程序上下文或它的子类。所以说你以不同的方式使用应用程序上下文是不对的。
                          【解决方案30】:

                          快速解决方案。

                          在 styles.xml 中更改您的基本主题父项

                          替换自

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

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

                          【讨论】:

                          • 对我没有帮助,异常仍然触发
                          猜你喜欢
                          • 2015-11-27
                          • 2016-07-04
                          • 2016-05-16
                          • 1970-01-01
                          • 2018-06-05
                          相关资源
                          最近更新 更多