2016-03-18 1 views
4

Приветствую моих друзей разработчиков!java.lang.IllegalStateException Вам необходимо использовать тему Theme.ppCompat (или потомок) с этой деятельностью

Я создал демонстрационное приложение для тестирования дизайна материала для 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+ приложение аварийно говорит: «К сожалению, материал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 или выше.

Может ли кто-нибудь объяснить идеальный случай, происходящий здесь, чтобы понять основную проблему?

Спасибо!

+0

Как вы знаете, когда у вас есть 2 styles.xml в стилях и стилях-v21, стили будут выбирать из них на разных устройствах. Если вы запустите его ниже 21, он будет выбирать styles.xml и другие, которые больше 21, будут выбирать темы из styles-v21. Здесь вы использовали тему материала, которая не имеет AppCompatActivity, которая использует только Activity. Вот почему он разбился. Вы можете использовать только один файл styles.xml и использовать AppCompatActivity, который будет работать во всех устройствах. – Raghavendra

+0

В Styles-v21.xml родительский атрибут должен содержать «Theme.AppCompat» –

ответ

4

Если Ваша деятельность в разделе от AppCompatActivity обязательна, ваша тема должна быть Theme.AppCompat theme (or descendant).

Если вы хотите использовать другие темы не от AppCompatActivity, и вы перестанете получать java.lang.IllegalStateException.

Надеюсь, что это поможет!

+0

Спасибо, я пытался изменить тему в стилях v21.xml на тема v21. Я предполагал использовать тему библиотеки поддержки. Это вызывало проблемы! Спасибо, сэр! Ты спас кучу! – Ariel

1

AppCompatActivity предполагается использовать с другими компонентами из библиотеки совместимости, и они ожидают, что вы определили некоторые атрибуты в своей теме (например, android: colorPrimary, android: colorSecondary и т. Д.). Если эти атрибуты не определены в вашей теме, компоненты, которые в них нуждаются, будут вызывать исключение RuntimeException. Темы Theme.AppCompat определяют эти атрибуты.

В обратном порядке проблем нет. Вы можете перейти от Activity и использовать тему Theme.AppCompat без проблем, но вы потеряете некоторые функции, предоставляемые AppCompatActivity.

Итак, если вы хотите использовать AppCompatActivity, используйте тему Theme.AppCompat или определите атрибуты, которые требуются в вашей теме. Вы можете перейти к строке, которая выдает исключение, чтобы увидеть, какой атрибут необходим.

Смежные вопросы

 Смежные вопросы