java.lang.IllegalStateException 您需要在此活动中使用 Theme.AppCompat 主



问候我的开发人员朋友们!

我创建了一个演示应用程序来测试 minSdk 14 和 targetSdj 23 的材料设计。我在下面有以下文件。它在 21 API 以下工作正常。我相信罪魁祸首是 Styles-v21.xml因为该应用程序在此之前运行良好。

这是一个简单的设置,只有一个活动。我正在测试材料主题和 AppCompat 主题以处理以下方案。

  1. Theme.AppCompat for API 低于 21。
  2. Theme.Material for API 21 and 21+.

该应用程序在API 21以下运行良好,但在21+以上,应用程序崩溃说:"不幸的是,材料测试已停止。

错误如下:

FATAL EXCEPTION: main
        Process: net.slidenerd.materialtest, PID: 28204
        java.lang.RuntimeException: Unable to start activity ComponentInfo{net.slidenerd.materialtest/net.slidenerd.materialtest.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
        Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
        at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:340)
        at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)
        at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
        at net.slidenerd.materialtest.MainActivity.onCreate(MainActivity.java:12)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

主活动.java

package net.slidenerd.materialtest;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
} 

样式.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

样式-v21.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar">
        <item name="android:colorPrimary">@color/colorPrimary</item>
        <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="android:colorAccent">@color/colorAccent</item>
    </style>
</resources>

清单.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.slidenerd.materialtest">
    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
        android:theme="@style/AppTheme"
        >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

解决方案:我通过扩展活动而不是 AppCompatActivity 解决了这个问题,并且应用程序在 API 14+ 到 API 23 上都能顺利运行。但是,您能否证明此问题的首选解决方案是合理的。

产生错误所需的所有代码都在上面。

注意:要产生错误,MainActivity 应扩展 AppCompatActivity,并且您应该在 API 21 或更高版本上运行。

谁能解释一下这里发生的理想案例,以便了解根本问题?

谢谢!

如果您的活动从AppCompatActivity扩展是强制性的,则您的活动主题必须Theme.AppCompat theme (or descendant)

如果您想使用其他主题,请不要从AppCompatActivity扩展,您将停止接收java.lang.IllegalStateException

希望这有帮助!!

AppCompatActivity 应该与 Compat 库中的其他组件一起使用,他们希望您在主题中定义了一些属性(如 android:colorPrimary、android:colorSecondary 等)。如果未在主题中定义这些属性,则需要它们的组件将引发运行时异常。Theme.AppCompat 主题定义了这些属性。

相反,没有问题。您可以从活动扩展并使用 Theme.AppCompat 的主题,而不会出现问题,但您将丢失 AppCompatActivity 提供的某些功能。

因此,如果要使用 AppCompatActivity,请使用 Theme.AppCompat 主题或在主题中定义所需的属性。您可以转到引发异常的行,以查看需要哪个属性。

相关内容