致命错误(使用 theme.appcompat),即使我使用的是 AppCompat 主题
Fatal error (use theme.appcompat), even though I am using the AppCompat theme
我最近将我的应用程序升级到了 material 主题。但是,我在 4.2.2 三星平板电脑上遇到崩溃。堆栈跟踪(在下面发布)告诉我我没有使用 Theme.AppCompat 的后代,尽管我相信我是。该应用似乎 运行 在 4.4 和 5.0 上运行良好。
这是来自三星平板电脑的堆栈跟踪:
02-23 19:21:29.490: E/AndroidRuntime(20724): FATAL EXCEPTION: main
02-23 19:21:29.490: E/AndroidRuntime(20724): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.name/com.app.name.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2295)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.access0(ActivityThread.java:150)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.os.Handler.dispatchMessage(Handler.java:99)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.os.Looper.loop(Looper.java:175)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.main(ActivityThread.java:5279)
02-23 19:21:29.490: E/AndroidRuntime(20724): at java.lang.reflect.Method.invokeNative(Native Method)
02-23 19:21:29.490: E/AndroidRuntime(20724): at java.lang.reflect.Method.invoke(Method.java:511)
02-23 19:21:29.490: E/AndroidRuntime(20724): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
02-23 19:21:29.490: E/AndroidRuntime(20724): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
02-23 19:21:29.490: E/AndroidRuntime(20724): at dalvik.system.NativeStart.main(Native Method)
02-23 19:21:29.490: E/AndroidRuntime(20724): Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:151)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.support.v7.app.ActionBarActivityDelegateBase.onCreate(ActionBarActivityDelegateBase.java:138)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:123)
02-23 19:21:29.490: E/AndroidRuntime(20724): at com.appconstructor.core2.MainActivity.onCreate(MainActivity.java:56)
02-23 19:21:29.490: E/AndroidRuntime(20724): at com.app.name.MainActivity.onCreate(MainActivity.java:12)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.Activity.performCreate(Activity.java:5283)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
02-23 19:21:29.490: E/AndroidRuntime(20724): ... 11 more
我的应用程序使用库来进行活动。清单看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.name"
android:versionCode="501"
android:versionName="5.0.1" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
[... Permissions]
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
[... Other activities]
[... etc]
</application>
</manifest>
/res/values/styles.xml
包含在库中,如下所示:
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
<!-- enable window content transitions -->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
如您所见,AppTheme 确实扩展了 Theme.AppCompat!
还有其他一些 values
个文件夹,但其中 none 个似乎适用。我有荷兰语翻译的 values-nl,values-v19
和 values-v21
,然后是 values-w820dp
,其中不包含 styles.xml。主应用程序中没有样式。
所以,我显然遗漏了一些东西。它可能是什么?\
更新 1:由于平板电脑实际上非常慢,我可以看到 activity 实际上正在加载为 holo。所以问题是加载了错误的主题。
根据我的经验,这可能是以下两种情况中的一种(根据您提供的示例):
- 当我切换到 appcompat 时,我遇到了很多这个问题,直到我在 Android 开发者博客上找到关于发布 appcompat 支持库的这一行你可以看到博客 post Here:
Migration from previous setup
For most apps, you now only need one theme declaration, in values/:
values/themes.xml:
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
<!-- Set AppCompat’s actionBarStyle -->
<item name="actionBarStyle">@style/MyActionBarStyle</item>
<!-- Set AppCompat’s color theming attrs -->
<item name=”colorPrimary”>@color/my_awesome_red</item>
<item name=”colorPrimaryDark”>@color/my_awesome_darker_red</item>
<!-- The rest of your attributes -->
</style>
You can now remove all of your values-v14+ Action Bar styles.
它显然没有说你必须删除那些其他 'values' 文件夹,但这样做对我有帮助。
- 如果您使用的是 appcompat,请确保您的 activity 类 扩展
ActionBarActivity 而不是同一博客中提到的 Activity
post:
New integration If you are not currently using AppCompat, or you are starting from scratch, here's how to set it up:
All of your Activities must extend from ActionBarActivity, which extends from FragmentActivity from the v4 support library, so you can
continue to use fragments.
All of your themes (that want an Action Bar/Toolbar) must inherit from Theme.AppCompat. There are variants available, including Light
and NoActionBar.
When inflating anything to be displayed on the action bar (such as a SpinnerAdapter for list navigation in the toolbar), make sure you
use the action bar’s themed context, retrieved via
getSupportActionBar().getThemedContext().
You must use the static methods in MenuItemCompat for any action-related calls on a MenuItem.
希望其中之一能有所帮助:)
编辑:
查看您的项目后,我看到了多个版本文件夹(mdpi-v11、transitions-v21 等)。 Appcompat 不适用于这些,原因我还没有发现。摆脱你的版本文件夹,保留所有基本文件夹,你就可以开始了。
我现在明白了问题,这个 Theme.AppCompat.Light.DarkActionBar
不是工具栏使用的有效主题,它使用旧的操作栏。您需要使用 Theme.AppCompat.Light
然后当您声明工具栏时您需要更改它的主题
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_my_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
如果你想要深色操作栏,请参阅 here
也可以参考这里
我最近将我的应用程序升级到了 material 主题。但是,我在 4.2.2 三星平板电脑上遇到崩溃。堆栈跟踪(在下面发布)告诉我我没有使用 Theme.AppCompat 的后代,尽管我相信我是。该应用似乎 运行 在 4.4 和 5.0 上运行良好。
这是来自三星平板电脑的堆栈跟踪:
02-23 19:21:29.490: E/AndroidRuntime(20724): FATAL EXCEPTION: main
02-23 19:21:29.490: E/AndroidRuntime(20724): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.name/com.app.name.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2295)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.access0(ActivityThread.java:150)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.os.Handler.dispatchMessage(Handler.java:99)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.os.Looper.loop(Looper.java:175)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.main(ActivityThread.java:5279)
02-23 19:21:29.490: E/AndroidRuntime(20724): at java.lang.reflect.Method.invokeNative(Native Method)
02-23 19:21:29.490: E/AndroidRuntime(20724): at java.lang.reflect.Method.invoke(Method.java:511)
02-23 19:21:29.490: E/AndroidRuntime(20724): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
02-23 19:21:29.490: E/AndroidRuntime(20724): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
02-23 19:21:29.490: E/AndroidRuntime(20724): at dalvik.system.NativeStart.main(Native Method)
02-23 19:21:29.490: E/AndroidRuntime(20724): Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:151)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.support.v7.app.ActionBarActivityDelegateBase.onCreate(ActionBarActivityDelegateBase.java:138)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:123)
02-23 19:21:29.490: E/AndroidRuntime(20724): at com.appconstructor.core2.MainActivity.onCreate(MainActivity.java:56)
02-23 19:21:29.490: E/AndroidRuntime(20724): at com.app.name.MainActivity.onCreate(MainActivity.java:12)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.Activity.performCreate(Activity.java:5283)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
02-23 19:21:29.490: E/AndroidRuntime(20724): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
02-23 19:21:29.490: E/AndroidRuntime(20724): ... 11 more
我的应用程序使用库来进行活动。清单看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.name"
android:versionCode="501"
android:versionName="5.0.1" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
[... Permissions]
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
[... Other activities]
[... etc]
</application>
</manifest>
/res/values/styles.xml
包含在库中,如下所示:
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
<!-- enable window content transitions -->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
如您所见,AppTheme 确实扩展了 Theme.AppCompat!
还有其他一些 values
个文件夹,但其中 none 个似乎适用。我有荷兰语翻译的 values-nl,values-v19
和 values-v21
,然后是 values-w820dp
,其中不包含 styles.xml。主应用程序中没有样式。
所以,我显然遗漏了一些东西。它可能是什么?\
更新 1:由于平板电脑实际上非常慢,我可以看到 activity 实际上正在加载为 holo。所以问题是加载了错误的主题。
根据我的经验,这可能是以下两种情况中的一种(根据您提供的示例):
- 当我切换到 appcompat 时,我遇到了很多这个问题,直到我在 Android 开发者博客上找到关于发布 appcompat 支持库的这一行你可以看到博客 post Here:
Migration from previous setup For most apps, you now only need one theme declaration, in values/:
values/themes.xml:
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
<!-- Set AppCompat’s actionBarStyle -->
<item name="actionBarStyle">@style/MyActionBarStyle</item>
<!-- Set AppCompat’s color theming attrs -->
<item name=”colorPrimary”>@color/my_awesome_red</item>
<item name=”colorPrimaryDark”>@color/my_awesome_darker_red</item>
<!-- The rest of your attributes -->
</style>
You can now remove all of your values-v14+ Action Bar styles.
它显然没有说你必须删除那些其他 'values' 文件夹,但这样做对我有帮助。
- 如果您使用的是 appcompat,请确保您的 activity 类 扩展 ActionBarActivity 而不是同一博客中提到的 Activity post:
New integration If you are not currently using AppCompat, or you are starting from scratch, here's how to set it up:
All of your Activities must extend from ActionBarActivity, which extends from FragmentActivity from the v4 support library, so you can continue to use fragments.
All of your themes (that want an Action Bar/Toolbar) must inherit from Theme.AppCompat. There are variants available, including Light
and NoActionBar.When inflating anything to be displayed on the action bar (such as a SpinnerAdapter for list navigation in the toolbar), make sure you use the action bar’s themed context, retrieved via
getSupportActionBar().getThemedContext().You must use the static methods in MenuItemCompat for any action-related calls on a MenuItem.
希望其中之一能有所帮助:)
编辑:
查看您的项目后,我看到了多个版本文件夹(mdpi-v11、transitions-v21 等)。 Appcompat 不适用于这些,原因我还没有发现。摆脱你的版本文件夹,保留所有基本文件夹,你就可以开始了。
我现在明白了问题,这个 Theme.AppCompat.Light.DarkActionBar
不是工具栏使用的有效主题,它使用旧的操作栏。您需要使用 Theme.AppCompat.Light
然后当您声明工具栏时您需要更改它的主题
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_my_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
如果你想要深色操作栏,请参阅 here
也可以参考这里