java.lang.IllegalStateException您需要在此活动中使用Theme.AppCompat主题(或后代)

时间:2016-03-18 05:03:31

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

向我的开发者朋友致意!

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

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

  1. 主题.AppCompat for API低于21。
  2. 用于API 21和21 +的Theme.Material。
  3. 该应用程序在API 21下工作正常,但是超过21+的应用程序崩溃说,"不幸的是,materialTest已停止。"

    错误如下:

    true

    MainActivity.java

    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)
    

    Styles.xml

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

    样式-v21.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>
    

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

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

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

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

    有人能解释这里发生的理想情况,以便了解潜在的问题吗?

    谢谢!

2 个答案:

答案 0 :(得分:4)

如果您的活动延伸至AppCompatActivity,则您的活动主题必须为Theme.AppCompat theme (or descendant)

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

希望这有帮助!!

答案 1 :(得分:1)

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

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

因此,如果您想使用AppCompatActivity,请使用Theme.AppCompat主题或定义主题中所需的属性。您可以转到抛出异常的行以查看所需的属性。