我最近将我的应用程序升级为素材主题。然而,我在4.2.2三星平板电脑上遇到了崩溃。stacktrace(发布在下面)告诉我没有使用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.access$700(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
文件夹,但似乎都不适用。我有荷兰语翻译的值nl,values-v19
和values-v21
,还有不包含styles.xml的values-w820dp
。主应用程序中没有样式。
所以,我显然错过了一些东西。可能是什么?\
更新1:由于平板电脑实际上非常慢,我可以看到活动实际上加载为holo。所以问题是加载了错误的主题。
根据我的经验,这可能是两件事中的一件(基于您提供的样本):
- 当我切换到appcompat时,我遇到了很多问题,直到我在Android开发者博客上发现了关于appcompat支持库发布的这一行。你可以在这里看到博客文章:
从以前的设置迁移对于大多数应用程序,您现在只需要一个主题声明,值/:
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>
现在,您可以删除所有值-v14+操作栏样式。
它显然没有说你必须删除那些其他的"值"文件夹,但这样做对我有帮助
- 如果您使用的是appcompat,请确保您的活动类扩展ActionBarActivity而不是同一博客中提到的Activity帖子:
新的集成如果您当前没有使用AppCompat,或者您正在从头开始,以下是如何设置它:
您的所有活动都必须从ActionBarActivity扩展,ActionBarActivity从v4支持库的FragmentActivity扩展,因此您可以继续使用碎片。
您的所有主题(需要操作栏/工具栏)都必须继承自Theme.AppCompat。有多种变体可用,包括Light
和NoActionBar。当对要显示在操作栏上的任何内容进行充气时(例如工具栏中用于列表导航的SpinnerAdapter),请确保使用操作栏的主题上下文,通过
检索getSupportActionBar().getThemedContext().对于MenuItem上的任何与操作相关的调用,都必须使用MenuItemCompat中的静态方法。
希望其中一个能有所帮助:)
编辑:
在查看了您的项目后,我看到了多个版本文件夹(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"/>
如果你想有黑暗的动作条看,然后看这里
也可以在这里查找参考
https://chris.banes.me/2014/10/17/appcompat-v21/