有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 java。你需要使用一个主题。此活动的AppCompat主题(或子代)

问候我的开发者朋友们

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

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

  1. 主题。API低于21的应用程序兼容
  2. 主题。API 21和21+的材料

该应用程序在API 21以下运行良好,但在API 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 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
        at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at 安卓.app.ActivityThread.-wrap11(ActivityThread.java)
        at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at 安卓.os.Handler.dispatchMessage(Handler.java:102)
        at 安卓.os.Looper.loop(Looper.java:148)
        at 安卓.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.安卓.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 安卓.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:340)
        at 安卓.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)
        at 安卓.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)
        at 安卓.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
        at net.slidenerd.materialtest.MainActivity.onCreate(MainActivity.java:12)
        at 安卓.app.Activity.performCreate(Activity.java:6237)
        at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at 安卓.app.ActivityThread.-wrap11(ActivityThread.java)
        at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at 安卓.os.Handler.dispatchMessage(Handler.java:102)
        at 安卓.os.Looper.loop(Looper.java:148)
        at 安卓.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:616)

主要活动。java

package net.slidenerd.materialtest;

import 安卓.app.Activity;
import 安卓.support.v7.app.AppCompatActivity;
import 安卓.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>

style-v21。xml

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

    </style>

</resources>

显示。xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
package="net.slidenerd.materialtest">

    <application
    安卓:allowBackup="true"
    安卓:icon="@mipmap/ic_launcher"
    安卓:label="@string/app_name"
    安卓:supportsRtl="true"
    安卓:theme="@style/AppTheme">

        <activity 安卓:name=".MainActivity"
        安卓:theme="@style/AppTheme"
        >
            <intent-filter>
                <action 安卓:name="安卓.intent.action.MAIN" />
               <category 安卓:name="安卓.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

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

上面列出了产生错误所需的所有代码

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

有人能解释一下这里发生的理想情况,以便理解根本问题吗

谢谢大家!


共 (2) 个答案

  1. # 1 楼答案

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

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

    希望这有帮助

  2. # 2 楼答案

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

    反过来说,没有问题。您可以从活动中扩展,并从主题中使用主题。AppCompat没有问题,但您将失去AppCompat活动提供的一些功能

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