Java.lang.IllegalStateException Necesita utilizar un tema Theme.AppCompat (o descendente) con esta actividad
Saludos mis amigos desarrollador!
He creado una aplicación de demostración para probar el diseño de material para minSdk 14 y targetSdj 23. Tengo los siguientes archivos a continuación. Funciona muy bien debajo de la API 21. Creo que el culpable es Styles-v21.xml como la aplicación funcionó bien antes de eso.
- ¿Cómo puedo obtener de forma confiable un color de un AttributeSet?
- Diseño de tabla XML? ¿Dos filas de la misma anchura con botones de igual anchura?
- Android Resource - Array de matrices
- Archivo no válido: google-play-services_lib / build.xml en android
- ¿Establecer un fondo a los botones en un diálogo?
Su una configuración simple, sólo una actividad. Estoy probando el tema Material y el tema AppCompat para trabajar con el siguiente escenario.
- Theme.AppCompat para API debajo de 21.
- Tema.Material para API 21 y 21+.
La aplicación funciona bien debajo de la API 21, pero por encima de 21+ la aplicación se bloquea diciendo: "Desafortunadamente, materialTest ha dejado de funcionar".
El error es el siguiente:
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); } }
Estilos.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>
Estilos-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>
Solución : Solucioné este problema extendiendo la actividad en vez de AppCompatActivity y la aplicación funciona muy bien tanto en API 14+ como en API 23 sin problemas. Pero, ¿podría usted justificar la solución preferida a este problema.
Todo el código necesario para producir el error está por encima.
Nota : Para producir el error, MainActivity debe extender AppCompatActivity y debe ejecutarse en API 21 o superior.
¿Podría alguien explicar el caso ideal que sucede aquí para comprender el problema subyacente?
¡Gracias!
- Cómo convertir una imagen en cadena base64
- ¿Cómo alineo una barra de herramientas de Android en la parte inferior de la pantalla?
- Android Studio: Problemas de renderización
- Atributo falta el prefijo de espacio de nombres android
- Uso de una tipografía personalizada en Android
- Prioridad de truncamiento de Android TextView o Resistencia de compresión
- Error Unparsed Aapt
- set Selector for Button Programmatically issues
Si su actividad se extiende desde AppCompatActivity
es obligatorio que su tema de actividad debe ser Theme.AppCompat theme (or descendant)
.
Si desea utilizar otro tema, no se extiende desde AppCompatActivity
y dejará de recibir java.lang.IllegalStateException
.
¡¡Espero que esto ayude!!
Se supone que AppCompatActivity se utiliza con otros componentes de la biblioteca Compat y esperan que haya definido algunos atributos en su tema (como android: colorPrimary, android: colorSecondary, etc.). Si estos atributos no están definidos en su tema, los componentes que los necesiten lanzarán una RuntimeException. Los temas Theme.AppCompat definen estos atributos.
En el camino inverso no hay ningún problema. Puede extenderse desde Actividad y utilizar un tema de Theme.AppCompat sin problemas, pero perderá alguna funcionalidad proporcionada por AppCompatActivity.
Por lo tanto, si desea utilizar AppCompatActivity, utilice un tema Theme.AppCompat o defina los atributos que requiere en su tema. Puede ir a la línea que lanza la excepción para ver qué atributo es necesario.