1

我最近将我的应用程序升级为材质主题。但是,我在 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.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文件夹,但似乎都不适用。我有荷兰语翻译的 values-nl,values-v19然后values-v21values-w820dp不包含styles.xml 的。主应用程序中没有样式。

所以,我显然错过了一些东西。会是什么呢?\


更新 1:由于平板电脑实际上真的很慢,我可以看到活动实际上加载为全息。所以问题是加载了错误的主题。

4

2 回答 2

2

根据我的经验,这可能是两件事中的一件(根据您提供的样本):

  1. 当我切换到 appcompat 时,我经常遇到这个问题,直到我在 Android 开发者博客上找到了关于 appcompat 支持库发布的这一行你可以在此处查看博客文章:

从以前的设置迁移对于大多数应用程序,您现在只需要一个主题声明,在 values/ 中:

值/主题.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”&gt;@color/my_awesome_red</item>
    <item name=”colorPrimaryDark”&gt;@color/my_awesome_darker_red</item>

    <!-- The rest of your attributes -->
</style>

您现在可以删除所有值-v14+ 操作栏样式。

它显然没有说您必须删除那些其他“值”文件夹,但这样做对我有帮助。

  1. 如果您使用的是 appcompat,请确保您的活动类扩展 ActionBarActivity 而不是同一篇博文中提到的 Activity:

新集成如果您当前没有使用 AppCompat,或者您是从头开始,请按照以下说明进行设置:

  • 您的所有活动都必须从 ActionBarActivity 扩展,后者从 v4 支持库中的 FragmentActivity 扩展,因此您可以继续使用片段。

  • 您的所有主题(需要操作栏/工具栏)都必须继承自 Theme.AppCompat。有可用的变体,包括 Light
    和 NoActionBar。

  • 在操作栏上显示任何内容时(例如用于工具栏中列表导航的 SpinnerAdapter),请确保使用操作栏的主题上下文,通过
    getSupportActionBar().getThemedContext() 检索。

  • 对于 MenuItem 上的任何与操作相关的调用,您必须使用 MenuItemCompat 中的静态方法。

希望其中之一有所帮助:)

编辑:

查看您的项目后,我看到了多个版本文件夹(mdpi-v11、transitions-v21 等)。Appcompat 不适用于这些我尚未发现的原因。摆脱您的版本文件夹,保留所有基本文件夹,一切顺利。

于 2015-02-23T18:50:28.730 回答
2

我现在看到了问题,这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/

于 2015-02-23T19:10:53.603 回答