Приветствую моих друзей разработчиков!java.lang.IllegalStateException Вам необходимо использовать тему Theme.ppCompat (или потомок) с этой деятельностью
Я создал демонстрационное приложение для тестирования дизайна материала для minSdk 14 и targetSdj 23. У меня есть следующие файлы ниже. Он отлично работает под 21 API. Я считаю, что виновником является Styles-v21.xml, так как приложение отлично работало до этого.
Его простая установка, всего лишь одно действие. Я тестирую тему Material и тему AppCompat для работы со следующим сценарием.
- Theme.AppCompat для API ниже 21.
- Theme.Material для API 21 и 21+.
Приложение работает отлично под API 21, но выше 21+ приложение аварийно говорит: «К сожалению, материалTest остановился».
Ошибка заключается в следующем:
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>
Стили-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>
Решение: Я решил эту проблему, расширяя активность вместо AppCompatActivity и приложение прекрасно работает как на API 14+ к API 23 гладко. Но не могли бы вы обосновать предпочтительное решение этой проблемы.
Весь код, необходимый для получения ошибки, указан выше.
Примечание: Для того, чтобы произвести ошибку, MainActivity должна распространяться AppCompatActivity и вы должны работать на API 21 или выше.
Может ли кто-нибудь объяснить идеальный случай, происходящий здесь, чтобы понять основную проблему?
Спасибо!
Как вы знаете, когда у вас есть 2 styles.xml в стилях и стилях-v21, стили будут выбирать из них на разных устройствах. Если вы запустите его ниже 21, он будет выбирать styles.xml и другие, которые больше 21, будут выбирать темы из styles-v21. Здесь вы использовали тему материала, которая не имеет AppCompatActivity, которая использует только Activity. Вот почему он разбился. Вы можете использовать только один файл styles.xml и использовать AppCompatActivity, который будет работать во всех устройствах. – Raghavendra
В Styles-v21.xml родительский атрибут должен содержать «Theme.AppCompat» –