【问题标题】:java.lang.IllegalStateException You need to use a Theme.AppCompat theme (or descendant) with this activityjava.lang.IllegalStateException 您需要在此活动中使用 Theme.AppCompat 主题(或后代)
【发布时间】:2016-07-04 17:50:34
【问题描述】:

问候我的开发者朋友!

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

这是一个简单的设置,只有一个活动。我正在测试 Material 主题和 AppCompat 主题以用于以下场景。

  1. Theme.AppCompat 用于 API 低于 21。
  2. Theme.Material 用于 API 21 和 21+。

应用程序在 API 21 以下运行良好,但在 21+ 以上应用程序崩溃并显示“不幸的是 materialTest 已停止。”

错误如下:

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)

MainActivity.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);
    }
} 

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

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

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

解决方案:我通过扩展 Activity 而不是 AppCompatActivity 解决了这个问题,并且应用程序在 API 14+ 到 API 23 上都运行良好。但是,你能证明这个问题的首选解决方案是合理的吗?

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

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

谁能解释这里发生的理想情况以了解根本问题?

谢谢!

【问题讨论】:

  • 如您所知,当您在样式和样式-v21 中有 2 个样式。如果你在 21 以下运行它,它会选择 styles.xml,其他大于 21 的将从 styles-v21 中选择主题。在这里,您使用了没有 AppCompatActivity 的 Material 主题,它只使用了 Activity。所以这就是它崩溃的原因。您只能使用一个 styles.xml 并使用将在所有设备上运行的 AppCompatActivity
  • 在 Styles-v21.xml 中,父属性应包含“Theme.AppCompat”

标签: java android xml android-studio material-design


【解决方案1】:

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

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

希望这会有所帮助!

【讨论】:

  • 谢谢我试图将样式 v21.xml 中的主题更改为 v21 主题。我想使用支持库主题。那是造成麻烦的原因!谢谢你,先生!你救了一大堆!
【解决方案2】:

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

反之则没有问题。您可以从 Activity 扩展并使用 Theme.AppCompat 中的主题而不会出现问题,但您将失去 AppCompatActivity 提供的一些功能。

因此,如果您想使用 AppCompatActivity,请使用 Theme.AppCompat 主题或在您的主题中定义它所需的属性。你可以去抛出异常的那一行看看需要哪个属性。

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 2014-12-28
    • 2022-01-24
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多