您需要在此活动中使用Theme.AppCompat主题(或后代)

时间:2014-02-16 17:34:09

标签: android android-layout

Android Studio 0.4.5

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

如果需要自定义对话框,则可以将“活动”显示为对话框而不是使用“对话框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>

我正在努力创建像这样的对话框,因为我已经完成了布局。

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

54 个答案:

答案 0 :(得分:1048)

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

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

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


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


注意:从AppCompatActivity(或子类,ActionBarActivity)更改为Activity时,还必须将具有“支持”的各种呼叫更改为相应的呼叫 “支持”。因此,请拨打getSupportFragmentManager

,而不是getFragmentManager

答案 1 :(得分:509)

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

答案 2 :(得分:227)

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

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

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

到:

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

没有更多问题。

答案 3 :(得分:89)

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

编辑:

我可能误读了操作帖。

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

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

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

答案 4 :(得分:73)

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

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

到此:

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

答案 5 :(得分:38)

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

Build - &gt; Clean Project; Build - &gt; Rebuild Project; Run - &gt; Run

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

希望它有所帮助!

答案 6 :(得分:24)

这就是为我解决的问题:我没有在清单中指定主题,而是在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之前设置主题。

答案 7 :(得分:19)

转到你的风格并把父母

parent="Theme.AppCompat"

而不是

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

答案 8 :(得分:16)

在我的情况下,我的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 :(得分:13)

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

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

答案 10 :(得分:13)

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

var currentPage = window.location.pathname.substring(1);
$('.tabs a').each(function(index, $tag){
  var link = $tag.attr('href');
  if(link === currentPage) {
    $('span', $tag).addClass('active');
  }
});

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

答案 11 :(得分:12)

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

答案 12 :(得分:12)

就做

new AlertDialog.Builder(this)

代替

new AlertDialog.Builder(getApplicationContext())

答案 13 :(得分:12)

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

{{1}}

答案 14 :(得分:7)

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

答案 15 :(得分:7)

对我来说是使用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?

答案 16 :(得分:6)

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

  1. 您应该使用活动 FragmentActivity 而不是 ActionbarActivity AppCompatActivity

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

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

答案 17 :(得分:6)

就我而言,当我尝试显示Dialog时出现了此类问题。 问题出在上下文中,我使用了 getBaseContext(),从理论上讲应该返回Activity上下文,但是看起来不是,而是在应用任何Theme之前返回上下文。

所以我只是将 getBaseContexts()替换为“ ”,现在它可以正常工作了。

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

答案 18 :(得分:6)

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

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

答案 19 :(得分:6)

将主题样式父级更改为

 parent="Theme.AppCompat"

这对我有用......

答案 20 :(得分:6)

我也有这个问题以及我做了什么来修复它,并且仍然使用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 :(得分:6)

这是你想要片段中的AlertDialog

prepareForSegue

答案 22 :(得分:5)

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

  

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

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

答案 23 :(得分:5)

我有一个主题为<android:theme="@android:style/Theme.Dialog">的活动,该活动用于在我的 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);
}

答案 24 :(得分:5)

根据我的经验,问题是我展示对话框的背景。 在按钮内单击我以这种方式实例化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();
                    }
            }
        }

这是我的解决方案。

答案 25 :(得分:5)

您之所以这样,是因为您希望将以前的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">

答案 26 :(得分:5)

这个对我有用:

<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 :(得分:4)

快速解决方案。

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

替换

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

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

答案 28 :(得分:3)

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

如果其他答案对某些人不起作用,请将其放在此处。

答案 29 :(得分:3)

对我来说,一种解决方案,尝试从这里尝试所有解决方案后,就要改变

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

答案 30 :(得分:3)

在我的情况下,我用ApplicationContext来扩展视图。当您使用ApplicationContext时,未应用主题/样式,因此虽然我的样式中有Theme.Appcompat,但它未应用并导致此异常。更多详情:Theme/Style is not applied when inflater used with ApplicationContext

答案 31 :(得分:3)

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

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

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

答案 32 :(得分:3)

这个解决方案对我有用。

设计库依赖于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'

答案 33 :(得分:2)

如果您在Recyclerview Adapter类中苦苦挣扎,请使用

view.getRootView().getContext()

代替

getApplicationContext() or activity.this

答案 34 :(得分:2)

对我来说,通过在我的customDialog类中将继承从AppCompatActivity更改为Activity来解决问题。 Theme.Dialog的清单中无需更改。

答案 35 :(得分:2)

这真的迫使我发表自己的答案。由于我使用的是Theme.AppCompat.Light.NoActionBar,并且还使用支持compat导入替换了所有AlertDialog,并且仍然遇到v21(Lollipop)以下的问题。 我不喜欢改变主题的想法。 所以在2天之后我终于考虑了其他为他们的AndroidManifest.xml指定AppTheme的库,是的,有一个 - &gt; “PayTM pgsdk库”。 所以跟着改变修复了问题。

  1. 将我的应用程序'AppTheme'重命名为'XYZAppTheme'
  2. 使用工具:在我的项目(app)的AndroidManifest中替换方法。

    <uses-permission android:name="android.permission.INTERNET" />
    
    <application
        android:name=".XYZ"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher_v2"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:roundIcon="@mipmap/ic_launcher_v2_round"
        android:supportsRtl="true"
        android:theme="@style/XYZAppTheme"
        tools:replace="android:icon,android:theme">
    
        <activity
            android:name=".xyz.SplashActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    

答案 36 :(得分:2)

从图片中突出显示的标签更改主题。enter image description here

答案 37 :(得分:2)

在Android Studio中: 将支持库添加到gradle文件并同步。 编辑build.gradle(Module:app)以获得依赖关系,如下所示:

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
}

我的支持库版本是23.1.1;使用适用的支持库版本。

答案 38 :(得分:2)

如果在放大布局时使用getApplicationContext()作为参数,则可以尝试使用getBaseContext()。例如

    View.inflate(getBaseContext(),
            getLayoutId() == 0 ? R.layout.page_default : getLayoutId(),
            null);

答案 39 :(得分:2)

我的活动与SectionsPagerAdapter和ViewPager&amp;片段

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

答案 40 :(得分:1)

首先,将其添加为import => import androidx.appcompat.app.AlertDialog

我将其发布为有史以来最小的解决方案。 我只是更改了

的实例

new AlertDialog.Builder(mContex)

new AlertDialog.Builder(mContext, R.style.PreferenceDialogLight)

<style name="PreferenceDialogLight" parent="Base.Theme.MaterialComponents.Dialog.Alert">

答案 41 :(得分:1)

检查您是否将正确的上下文传递给您的 Dialog。这发生在我身上,然后我意识到我使用 AlertDialog.Builder 而不是 applicationContext 上下文来启动 Activity

答案 42 :(得分:1)

还原VCS本地历史记录后,别忘了清理项目

答案 43 :(得分:1)

在我的情况下,我将AppTheme中的AndroidManifest正确设置为从Theme.AppCompat继承的样式。但是,各个活动在AndroidManifest中具有样式设置,这些样式设置对此进行了覆盖。

答案 44 :(得分:1)

在我的情况下,我使用的是一种名为“ FullScreenTheme”的样式,尽管它似乎已正确定义(它是Theme.AppCompat的后代),但却无法正常工作。

我终于意识到我正在使用一个AAR库,该库在内部也定义了一种名为“ FullScreenTheme”的样式,而它不是Theme.AppCompat的后代。名称冲突造成了问题。

通过重命名我自己的样式名称来修复它,因此现在Android使用的是正确的样式。

答案 45 :(得分:1)

在您的app/build.gradle中添加此依赖项:

implementation "com.google.android.material:material:1.1.0-alpha03"

更新您的styles.xml AppTheme的父级:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"/>

答案 46 :(得分:1)

注意:我原本打算将其作为答案,但是进一步的测试表明,当从命令行使用maven构建它时仍然会失败,所以我必须编辑它才能成为问题! : - (

就我而言,当我收到此错误时,我已经在使用AppCompat主题并且错误没有多大意义。

我正在对我的android构建进行mavenizing。我已经依赖于applat的apklib和jar版本,因此:

    <!-- See https://github.com/mosabua/maven-android-sdk-deployer -->
        <dependency>
            <groupId>android.support</groupId>
            <artifactId>compatibility-v7-appcompat</artifactId>
            <version>${compatibility.version}</version>
            <type>apklib</type>
        </dependency>

        <dependency>
            <groupId>android.support</groupId>
            <artifactId>compatibility-v7-appcompat</artifactId>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>android.support</groupId>
            <artifactId>compatibility-v7</artifactId>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>android.support</groupId>
            <artifactId>compatibility-v4</artifactId>
        </dependency>

现在,当我导入maven项目并从IntelliJ构建和运行时,它很好。

但是当我使用maven从命令行构建和部署并运行时,我仍然会遇到此异常。

答案 47 :(得分:0)

使用Kotlin,直到将Builder参数从'applicationContext'更改为'this'为止,什么都无法解决我的问题。

不起作用

val dialogDelete = AlertDialog.Builder(applicationContext)
            .setTitle("Confirmation")
            .setMessage("Delete this photo?")
            .setNegativeButton(android.R.string.no){ it, which ->
                it.dismiss()
            }
dialogDelete.show()

作品

val dialogDelete = AlertDialog.Builder(this)
            .setTitle("Confirmation")
            .setMessage("Delete this photo?")
            .setNegativeButton(android.R.string.no){ it, which ->
                it.dismiss()
            }
dialogDelete.show()

答案 48 :(得分:0)

如果您在项目中使用 VCS(例如,GIT),请尝试:

  1. 删除您的本地项目文件;
  2. 从远程重新导入。

问题解决了!

就我而言,我删除了一个包含错误的文件,但不知何故 Studio 仍在检测该文件并因此阻止它构建。

希望对您有所帮助!

答案 49 :(得分:-1)

只是做那个

  

getApplicationContext()。getTheme()。applyStyle(R.style.Theme_Mc,   真);

并在您的values / styles.xml中 添加这个

 <style  name="Theme.Mc" parent="Theme.AppCompat.Light.NoActionBar">
         <!-- ADD Your Styles  -->


     </style>

答案 50 :(得分:-1)

关于在应用程序中进行很多更改,而不是所有这些。.就像此视频一样简单。

https://www.youtube.com/watch?v=Bsm-BlXo2SI

我已经用过了,所以...有效率为100%。

答案 51 :(得分:-1)

对我来说,Android SDK似乎无法找到样式定义。一切都正确连线,做一个简单的项目干净修复它为我。

答案 52 :(得分:-3)

对于我的Xamarin Android项目(在MainActivity.cs中),我改变了......

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity

......错误消失了。我意识到这不是每个人的解决方案,但它可能会给潜在问题提供线索。

答案 53 :(得分:-4)

如果有人仍然对这个问题感到疑惑。

试试这个:

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