简体   繁体   中英

java.lang.IllegalStateException You need to use a Theme.AppCompat theme (or descendant) with this activity

Greetings my developer friends!

I created a demo app to test the material design for minSdk 14 and targetSdj 23. I have the following files below. It works fine below the 21 API. I believe the culprit is Styles-v21.xml as the app worked fine before that.

Its a simple setup, just one activity. I am testing the Material theme and AppCompat theme for working with the following scenario.

  1. Theme.AppCompat for API below 21.
  2. Theme.Material for API 21 and 21+.

The app works fine below API 21, but above 21+ the App crashes saying,"Unfortunately materialTest has stopped."

The error is as follows:

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>

Solution : I solved this issue by extending Activity instead of AppCompatActivity and the application runs fine on both API 14+ to API 23 smoothly. But, could you justify the preferred solution to this problem.

All the code needed to produce the error is above.

Note : To produce the error, MainActivity should extend AppCompatActivity and you should run on API 21 or above.

Could anyone explain the ideal case happening here so as to understand the underlying problem?

Thank You!

If your activity extends from AppCompatActivity is mandatory that your activity theme must be Theme.AppCompat theme (or descendant) .

If you want to use other theme don't extends from AppCompatActivity and you'll stop receiving java.lang.IllegalStateException .

Hope this helps!!

The AppCompatActivity is supposed to be used with other components from the Compat library, and they expect that you have defined some attributes in your theme (like android:colorPrimary, android:colorSecondary, etc). If these attributes are not defined in your theme, the components that need them will throw a RuntimeException. Theme.AppCompat themes define these attributes.

In the reverse way there is no problem. You can extend from Activity and use a theme from Theme.AppCompat without problems, but you will lose some functionality provided by the AppCompatActivity.

So, if you want to use AppCompatActivity, use a Theme.AppCompat theme or define the attributes it requires in your theme. You can go to the line that throws the exception to see which attribute is needed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM