您需要将 Theme.AppCompat 主题(或后代)用于此活动

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

提问人:ant2009 提问时间:2/17/2014 最后编辑:Samuel Liewant2009 更新时间:9/29/2023 访问量:1097114

问:

Android 工作室 0.4.5

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

如果需要自定义对话框,可以改为将活动显示为对话框,而不是使用对话框 API。只需创建一个活动并将其主题设置为 Theme.Holo.Dialog manifest 元素:<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>

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

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

安卓 android-layout

评论

2赞 ant2009 2/17/2014
@Raghunandan,我是新手,但看看我的风格,我有以下几点: <style name=“AppTheme” parent=“Theme.AppCompat.Light.DarkActionBar”> 我有以下导入:导入android.support.v7.app.ActionBarActivity;导入 android.support.v7.app.ActionBar;导入 android.support.v4.app.Fragment;但不确定这一切意味着什么。
14赞 Raghunandan 2/17/2014
您正在使用支持库来支持 api 级别 11 以下的操作栏。仅用于清单中的活动AppCompatandroid:theme="@style/AppTheme" >
2赞 cryptochronoconolite 2/17/2014
@ant2009,为了概括@Raghunandan所说的话:在您的 中,您为活动指定的主题将覆盖您为应用程序指定的主题。从标签中删除该行。AndroidManifest.xmlandroid:theme<activity>
3赞 Bobbake4 2/17/2014
这样做将消除错误,但不会让他到达他想去的地方,这是一个带有对话主题的活动。一般规则是,如果您希望您的活动具有操作栏,它应该具有 AppCompat 主题,并且 java 代码应扩展 ActionBarActivity。如果您有一个不需要操作栏的活动(例如以对话为主题的活动),则可以对其应用任何主题,但 java 代码必须扩展普通的旧活动。
1赞 Vitaliy A 7/29/2018
我认为在这种情况下唯一的问题是您为 Dialog constractor 提供的上下文。看我的答案。stackoverflow.com/a/51574281/232727

答:

128赞 Raghunandan 2/17/2014 #1

最小 SDK 为 10。 从 API 级别 11 开始提供。因此,对于 10 个,您将使用您需要使用的支持库或相同的后代。ActionBarAppCompatTheme.AppCompat

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

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

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

更多信息@

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

编辑:

我可能误读了 op 帖子。

似乎 op 想要一个带有活动主题的对话。因此,正如 Bobbake4 已经建议的那样,extend 而不是 .ActivityActionBarActivity

还可以在下面的链接中查看@ 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/

评论

0赞 ant2009 2/17/2014
谢谢你的建议。实际上,我已经尝试过了。我遇到了同样的问题。我的样式文件如下所示:<style name=“AppTheme” parent=“Theme.AppCompat”>
0赞 Raghunandan 2/17/2014
@ant2009你不会。将支持库 AppCompat 中的主题用于您的活动
0赞 ant2009 2/17/2014
我不确定我是否正确添加此主题。但是您的意思是添加以下导入语句吗?导入 android.support.v7.appcompat.*;但是,我确实尝试过,也许我错了,因为我最终仍然遇到了同样的例外。
0赞 Raghunandan 2/17/2014
@ant2009,您可以拥有自定义对话框。但是你想全屏对话吗?
0赞 ant2009 2/17/2014
我不想让它全屏显示。只是一个对话框。但是,现在问题解决了。Bobbake4 做对了。无论如何,感谢您的努力,您提供了有用的建议。但是,我仍然对所有这些支持库和 AppCompat 感到困惑。
1223赞 Bobbake4 2/17/2014 #2

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

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

在这种情况下,将 Java 继承从 更改为 ,并将对话框主题保留在清单中,保持原样,即非值ActionBarActivityActivityTheme.AppCompat


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


注意:当从 (或子类, ) 更改为 时,还必须将带有 “support” 的各种调用更改为没有 “support” 的相应调用。因此,不要 ,而是 调用 。AppCompatActivityActionBarActivityActivitygetSupportFragmentManagergetFragmentManager

评论

6赞 Raghunandan 2/17/2014
OP 正在使用 appcompat,在这种情况下,他应该扩展,这是从他的 import 语句中显示的内容,来自 Quesiton 下方的注释。ActionBarActivity
2赞 Bobbake4 9/27/2014
@Bursos 如果你说的是当你在 Android Studio 中创建一个新项目时,我猜这是标准配置中的一个错误。
2赞 5er 11/4/2014
@Bobbake4,我有同样的问题,这个解决方案对我来说是不可能的。问题是我无法扩展 Activity,因为我有一堆在 ActionBarActivity 上中继的类(整个项目)。有没有其他解决方案可以解决这个问题?感谢
6赞 Bobbake4 11/5/2014
@5er 如果 Java 使用的是 ActionBarActivity,则主题必须扩展 Theme.AppCompat。有一些内置主题可以扩展 Theme.AppCompat,或者您可以自己扩展并修改它。如果不删除 ActionBarActivity 父级,则无法使用 Theme.AppCompat 进行处理。
38赞 Harmeet Singh 12/1/2014
在样式<样式名称=“AppTheme”parent=“Theme.AppCompat.Light.DarkActionBar”中>这解决了我的问题。:)
650赞 iusting 9/4/2014 #3

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

评论

2赞 speedynomads 11/18/2014
在代码中,ant2009 将 AppTheme 设置为应用程序,它们从 Theme.AppCompat 的后代扩展而来。这应该行得通。在我的设备上升级到 5.0 后,我遇到了同样的问题,最终将 @style/Theme.AppCompat.Light 设置为我活动的主题。这里有些不对劲......
41赞 zeeshan 1/31/2015
对于Android Studio来说,这不是一个有效的答案,尽管在某些情况下,当绕过样式.xml文件时,它可以作为快速修复。在Android Studio中,定义主题的正确方法是在styles,.xml文件中定义它们,然后Android menifest文件将仅引用它们,并根据您在设备上运行的Android版本选择它们。通常设置为android:theme=“@style/AppTheme”,这个AppTheme在样式中引用<style name=“Theme.AppTheme” parent=“Theme.AppCompat.Light”>.xml
6赞 AndyD273 5/13/2015
这对我来说并不奏效,因为当我使用除全息之外的任何东西时,我的标题栏就消失了......
1赞 worked 9/23/2015
使用 SnackBar 也遇到了这个问题。这解决了我的问题。
2赞 letroll 4/18/2016
@Martin,如果你像我一样,你忘记在一般文件样式中添加相同的样式名称.xml而不是在(V21)样式.xml文件中添加相同的样式名称(没有特定于V21的属性)。如果您在 V21 文件夹中声明样式,并且您的设备具有以下版本。它找不到它,因此触发了异常。
10赞 danigonlinea 11/27/2014 #4

您之所以这样做,是因为您想将 Material Design 应用于之前 sdk 版本中的主题样式到 21。 因此,如果您还想阻止自己对 AppTheme 的自定义,只需更改样式.xml(在 SDK 21 之前),这样就可以继承 App Compat 主题。ActionBarActivityAppTheme

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

为此:

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

评论

6赞 Martin 12/26/2014
做到了。还是有问题。所以还有更多。
27赞 Yamen Nassif 12/3/2014 #5

转到您的样式并放置父项

parent="Theme.AppCompat"

而不是

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

评论

0赞 Andrew S 11/9/2016
为什么我们可以通过标准活动来做到这一点。Android 是否没有在 ICS 或 Honecomb 的标准活动上设置操作栏?如果我们将最小目标设置为 SDK ICS,我们是否总是必须使用 ActionBarActivity?
0赞 blackHawk 5/13/2017
如何查看我们应该将哪个主题与我们正在使用的类型或功能一起使用,因为当我们导入时,我们有所有类型的主题可用
0赞 Md Nakibul Hassan 6/9/2020
谢谢。这个答案帮助了我。:)
33赞 k29 1/15/2015 #6

这就是为我修复它的原因:我没有在清单中指定主题,而是为每个扩展的活动定义了它:onCreateActionBarActivity

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

这里是 的后代,在 xml 中定义。请注意,主题必须在 和 之前设置。MyAppThemeTheme.AppCompatsuper.onCreatesetContentView

评论

1赞 Rhys Davis 2/27/2015
Robolectric 在尝试加载资源时在 setTheme 行处抛出 NullPointerException。知道为什么吗?
0赞 k29 2/27/2015
@RhysDavis 没有堆栈跟踪很难说,但也许它首先想要 setContentView?在这种情况下,此修复程序将不适合您。
6赞 Fazal 2/2/2015 #7

将主题样式父级更改为

 parent="Theme.AppCompat"

这对我有用......

6赞 user1501382 4/18/2015 #8

这个对我有用:

<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>
6赞 Md Imran Choudhury 4/21/2015 #9

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

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

android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 
16赞 goRGon 4/29/2015 #10

即使该活动确实使用了 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"

评论

2赞 danb 6/13/2015
刚刚也遇到了这个问题,我没有验证修复程序,无法重现错误。但我仅在三星设备上看到此错误。大多数似乎也是根深蒂固的,FWIW
0赞 Mark 8/18/2015
我在帖子顶部说明了错误,并且在我添加了警报对话框后发生了错误。我在清单中拥有所有相关的样式信息。通过更改警报生成器中的上下文引用解决了我的问题 - 我将:new android.support.v7.app.AlertDialog.Builder(getApplicationContext())更改为:new android.support.v7.app.AlertDialog.Builder(this),没有更多问题...
0赞 AAverin 4/21/2020
您有关于此优化的更多详细信息或三星链接吗?那么,是否所有活动都必须实现 Theme.AppCompat,或者是否可以有没有主题的活动?
14赞 JonasOliveira 5/4/2015 #11

如果需要扩展 ActionBarActivity,则需要在样式 .xml 上:

<!-- 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:You need to use a Theme.AppCompat theme (or descendant) with this activity”错误。

7赞 Kaloglu 6/15/2015 #12

对于该错误,您有很多解决方案。

  1. 应使用 Activity 或 FragmentActivity,而不是 ActionbarActivityAppCompatActivity

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

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

318赞 A.K. 9/3/2015 #13

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

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

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

自:

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

而且没有更多的问题。

评论

5赞 kirtan403 11/27/2015
这也发生在我身上。我只是在尝试,你的答案真的很有效!它工作的逻辑是什么?我真的不明白。
7赞 Anne Gunn 5/25/2016
或者,如果要在片段中生成 AlertDialog,而不是直接在 Activity 中生成 AlertDialog,请使用 Role,而不是按照上面的建议,问题已解决。至于为什么,我只能推测较旧的 AlertDialog.Builder(xxx) 代码要么想要传入不同的类型,要么只是对传入的内容不那么挑剔,而当前的 Builder() 真的非常想要一个 Activity。由于谷歌选择隐藏(删除?)旧代码的文档,大概是为了鼓励使用 v7.app 版本,我不知道有什么办法确定。getActivity()this
0赞 Harisewak 9/10/2016
做了与建议相反的事情。它:P奏效了。谢谢!
1赞 Ibrahim.H 11/8/2017
这为我解决了程序,如果您在 ArrayAdapter 或类似的适配器类中,您也会使用而不是使用。getContext()this
2赞 prazeev 5/21/2019
这是我见过的真正解决方案。提示:请提及 getApplicationContext() 中的差异。
7赞 shikha 2/9/2016 #14

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

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

评论

0赞 shikha 2/9/2016
<activity android:name=”。MainActivity“ android:label=”@string/app_name“ android:theme=”@style/AppTheme“> </activity>
14赞 Marc Baduq 3/8/2016 #15

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

评论

0赞 baskren 8/30/2023
这是从 Activity 更新到 AppCompatActivity 时的正确答案。
58赞 Geraldo Neto 4/29/2016 #16

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

(Build -> Clean 项目 ;Build -> Rebuild 项目 ;运行 -> 运行)

它可能看起来很愚蠢,但现在它工作得很好

只是希望它有所帮助!

评论

1赞 halxinate 5/13/2016
将 DialogFragment 添加到 AppCompat 活动后出现完全相同的消息。文件,使缓存无效/重新启动在紧要关头修复了这个问题。
3赞 Dika 10/9/2019
我尝试了这个线程中几乎所有的答案。但只有这个看似“愚蠢”的答案才有效。谢谢!
2赞 rmirabelle 12/30/2020
如有疑问,请假设 Android Studio 已悄悄破坏了您的整个代码库,然后尝试重新构建。这对我有用。亲爱的上帝,我对 Android 的仇恨是无限的。
19赞 aligur 6/23/2016 #17

就我而言,我的 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>

评论

0赞 Nishant Soni 6/29/2018
我在 Oreo+ 设备上运行我的项目,只有这对我有用。
8赞 Peter 9/21/2016 #18

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

21赞 sharma_kunal 10/1/2016 #19

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

<activity
            android:name="HomeActivity"
            android:screenOrientation="landscape"
            android:theme="@style/Theme.AppCompat.Light"
            android:windowSoftInputMode="stateHidden" />
153赞 Darush 10/22/2016 #20

如果您使用的是应用程序上下文,如下所示:

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

将其更改为如下活动上下文:

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

评论

0赞 lbarbosa 1/30/2017
如果使用 LayoutInflater.from(<aplication context>),请确保使用活动上下文或提供的 LayoutInflater,以便它继承正确的主题。
1赞 kostyabakay 4/19/2017
您的解决方案在我的情况下帮助了我。你能解释一下getApplicationContext()和MainActivity.this有什么区别吗?
0赞 Darush 4/20/2017
请参阅此链接: stackoverflow.com/questions/22966601/...
15赞 behelit 11/2/2017
您需要一个活动,而不是一个上下文来显示对话框
9赞 Minh Nghĩa 6/17/2020
那到底为什么需要一个?AlertDialog.Builder()Context
8赞 Wraithious 10/28/2017 #21

我也遇到了这个问题,我做了什么来解决它,并且仍然使用 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,则只需清理并重新生成项目即可。

7赞 Azhar osws 11/18/2017 #22

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

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

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

7赞 Dante 1/29/2018 #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();
                    }
            }
        }

这是我的解决方案。

评论

0赞 Hod 3/13/2018
你说得对,你不应该以最初的方式使用应用程序上下文。您所做的是改用 Activity 作为上下文。但是,这不是应用程序上下文或其子类。因此,说您以不同的方式使用应用程序上下文是不对的。
18赞 Ali Akram 6/27/2018 #24

说干就干

new AlertDialog.Builder(this)

而不是

new AlertDialog.Builder(getApplicationContext())

评论

0赞 Erich García 7/29/2018
工作解决方案!30 分钟找出这个答案。为什么我使用新的 AlertDialog.Builder(getApplicationContext())?
0赞 Blago 2/12/2019
解释预期的类型会很有帮助。this
11赞 Vitaliy A 7/29/2018 #25

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

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

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

评论

0赞 Jeeva 4/15/2019
我正在传递 getApplicaitonContext(),但你的做到了
10赞 Elyas Nategh 9/15/2018 #26

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

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

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

评论

2赞 Cory Trese 12/17/2018
这是一个直截了当的答案,对我有用,没有公认的答案的所有复杂性和不答案。
9赞 Shivam Dawar 10/8/2019 #27

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

17赞 PPP 5/3/2020 #28

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

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

评论

0赞 CamHart 5/11/2021
@style/Theme.AppCompat.Light 如果要保留操作栏,也可以使用。
0赞 kangkyu 9/23/2023
请参阅 stackoverflow.com/a/35556478/3622415,这是如何使用“Theme.AppCompat 主题(或后代)”的问题 就我而言,添加谷歌安卓材料解决了问题。并且是他们的主题之一 - 可能是implementation("com.google.android.material:material:1.9.0")Theme.Material3.DayNightTheme.AppCompat
7赞 Nur Alam 8/22/2021 #29

我遇到了同样的问题。

如果要为任何类或方法提供上下文,请提供 YourActivityName.this 而不是 getApplicationContext()。

执行此操作

builder = new AlertDialog.Builder(YourActivity.this);

而不是

builder = new AlertDialog.Builder(getApplicationContext());
9赞 Martin Zeitler 11/5/2021 #30

万一AndroidX库把你带到了这里......SplashScreen

这是因为也没有:Theme.SplashScreenR.styleable.AppCompatTheme_windowActionBar

if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {
    a.recycle();
    throw new IllegalStateException(
            "You need to use a Theme.AppCompat theme (or descendant) with this activity.");
}

这需要在调用 之前将主题切换到 :postSplashScreenThemesuper()

@Override
protected void onCreate(Bundle savedInstanceState) {

    /* When switching the theme to dark mode. */
    if (savedInstanceState != null) {
        this.setTheme(R.style.AppTheme);
    }
    super.onCreate(savedInstanceState);
    
    /* When starting the Activity. */
    if (savedInstanceState == null) {
        SplashScreen.installSplashScreen(this);
    }
}

那么 from 不会干扰。Theme.SplashScreenAndroidManifest.xml


也相当相关:使用 时,包含一个桥主题,可以替代 : 。Theme.MaterialComponentsTheme.AppCompatTheme.MaterialComponents.DayNight.NoActionBar.Bridge

尽管没有继承自:BridgeTheme.MaterialComponentsTheme.AppCompat

<?xml version="1.0" encoding="utf-8"?>
<resources>    
    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge" />   
    <style name="AppTheme.SplashScreen" parent="Theme.SplashScreen" />    
</resources>

评论

1赞 Jeremiah Polo 1/18/2022
在 Kotlin 中,SplashScreen.installSplashScreen(this) 更改为 installSplashScreen(),因为它是一个扩展函数
1赞 Joao 8/18/2022
在调用 super.onCreate() 之前,在启动活动中调用 installSplashScreen。developer.android.com/guide/topics/ui/splash-screen/migrate
0赞 Javad 9/20/2023
对于那些现在看到这个答案的人来说,来自材料组件(包括)的“桥梁主题”起作用的原因是它们间接扩展(通过几个中间主题)。Theme.MaterialComponents.DayNight.NoActionBar.BridgeTheme.AppCompat