ActionBarCompat: java.lang.IllegalStateException: necesita usar un Theme.AppCompat


102

Recibo una RuntimeException en Android 2.3.5 pero estoy usando Theme.AppCompat (res / values ​​/ themes.xml). Este es el teléfono: http://www.gsmarena.com/samsung_galaxy_y_s5360-4117.php

 <!-- res/values/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>

     <style name="Theme.Styled" parent="@style/Theme.AppCompat">
         <item name="actionBarStyle">@style/QueryActionBar</item>
         <item name="android:actionBarStyle">@style/QueryActionBar</item>
     </style>

     <style name="QueryActionBar" parent="@style/Widget.AppCompat.ActionBar">
         <item name="background">@color/blueback</item>
         <item name="android:background">@color/blueback</item>
         <item name="backgroundSplit">@color/blueback</item>
         <item name="android:backgroundSplit">@color/blueback</item>
     </style>

 </resources>

Aquí está el archivo para values-v11.

 <!-- res/values-v11/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@android:style/Theme.Holo">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

Aquí está el error.

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.txt2lrn.www/com.txt2lrn.www.LandingActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
 at android.app.ActivityThread.access$1500(ActivityThread.java:117)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:130)
 at android.app.ActivityThread.main(ActivityThread.java:3687)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:507)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
 at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
 at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:102)
 at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98)
 at com.txt2lrn.www.LandingActivity.onCreate(LandingActivity.java:95)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
 ... 11 more

Lo siento amigos, también tengo android: theme = "@ style / Theme.Styled" definido en AndroidManifest.xml.


1
¿Su manifiesto hace referencia Theme.Styled?
CommonsWare

3
¿Tiene otra carpeta de valores que hace referencia a Theme.Styled pero no usa el tema AppCompat?
tyczj

@tyczj He agregado el archivo res / values-v11 / themes.xml y no hace referencia a Theme.Styled
AG1

@tyczj Puede usar su comentario como respuesta, ya que puede ser un problema común (yo también)
Valentino Dell'Aica

Respuestas:


96

Si está extendiendo ActionBarActivity en su MainActivity, también tendrá que cambiar el tema principal en values-v11.
Entonces el style.xml en values-v11 será -

 <!-- res/values-v11/themes.xml -->
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@style/Theme.AppCompat">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

EDITAR: Le recomendaría que deje de usar ActionBar y comience a usar el diseño de AppBar incluido en la Biblioteca de soporte de diseño de Android


5
Excelente, me perdí esto. No olvide todas las otras carpetas -vXX también, o funcionará bien en su entorno de prueba, solo para morderlo una vez que alguien use una de esas versiones.
falstro

1
¡Gracias! ¡Acabo de cambiar ActionBarActivity a Activity! :)
Inoy

66

Para agregar simplemente ActionBar Compat, su actividad o aplicación debe usar el tema @ style / Theme.AppCompat en AndroidManifest.xml de esta manera:

   <activity
        ...
        android:theme="@style/Theme.AppCompat" />

Esto agregará la barra de acción en actividad (o todas las actividades si agregó este tema a la aplicación)


Pero generalmente necesitas personalizar tu barra de acciones. Para hacer esto, necesita crear dos estilos con Theme.AppCompat parent, por ejemplo, "@ style / Theme.AppCompat.Light". El primero será para api 11> = (versiones de android con barra de acción de Android incorporada), el segundo para api 7-10 (sin barra de acción incorporada).

Veamos el primer estilo. Se ubicará en res / values-v11 / styles.xml . Se verá así:

<style name="Theme.Styled" parent="@style/Theme.AppCompat.Light">
    <!-- Setting values in the android namespace affects API levels 11+ -->
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <!-- Setting values in the android namespace affects API levels 11+ -->
    <item name="android:background">@drawable/ab_custom_solid_styled</item>
    <item name="android:backgroundStacked"
      >@drawable/ab_custom_stacked_solid_styled</item>
    <item name="android:backgroundSplit"
      >@drawable/ab_custom_bottom_solid_styled</item>
</style>

Y debe tener el mismo estilo para la API 7-10. Se ubicará en res / values ​​/ styles.xml , PERO debido a que los niveles de API aún no conocen los elementos originales de estilo de la barra de acciones de Android, deberíamos usar uno, proporcionado por la biblioteca de soporte. Los elementos de ActionBar Compat se definen como el androide original, pero sin la parte "android:" al frente:

<style name="Theme.Styled" parent="@style/Theme.AppCompat.Light">
    <!-- Setting values in the default namespace affects API levels 7-11 -->
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="Widget.Styled.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <!-- Setting values in the default namespace affects API levels 7-11 -->
    <item name="background">@drawable/ab_custom_solid_styled</item>
    <item name="backgroundStacked">@drawable/ab_custom_stacked_solid_styled</item>
    <item name="backgroundSplit">@drawable/ab_custom_bottom_solid_styled</item>
</style>

Por favor, marque que, incluso si los niveles de API superiores a 10 ya tienen barra de acción, aún debe usar los estilos de AppCompat. Si no lo hace, tendrá este error al iniciar Acitvity en dispositivos con Android 3.0 y superior:

java.lang.IllegalStateException: debe usar un tema Theme.AppCompat (o descendiente) con esta actividad.

Aquí está el enlace de este artículo original http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html escrito por Chris Banes.

PD Perdón por mi inglés


¡justo en el clavo! UPVPTED
tony gil

20

Verifique y asegúrese de que no tiene otra carpeta de valores que haga referencia a theme.styled y no use el tema AppCompat

es decir values-v11carpeta


Este también era mi problema. Tenía un proyecto de biblioteca y tuve que importar la biblioteca appcompat-v7 y hacer que todos los temas extendieran los temas de AppCompat. El caso es que mi proyecto principal tiene la opción tools: replace = "android: icon, android: theme" agregada a la <application> y debería omitir los estilos de otros proyectos. Por alguna razón eso no estaba funcionando.
Speedynomads

16

Prueba esto...

styles.xml

<resources>
 <style name="Theme.AppCompat.Light.NoActionBar" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
 </style>
</resources>

AndroidManifest.xml

   <activity
        android:name="com.example.Home"
        android:label="@string/app_name" 
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

11

Tu se Activityestá extendiendo, lo ActionBarActivityque requiere AppCompat.themeque se aplique. Cambie de ActionBarActivitya Activityo FragmentActivity, solucionará el problema.


4

Solo hazlo Construir -> Proyecto Limpio. Creo que esto solucionará tu problema.


3

Mi manifiesto no hace referencia a ningún tema ... no debería tener por qué AFAIK

Claro que sí. Nada se aplicará mágicamente Theme.Styleda una actividad. Debe declarar que sus actividades, o toda su aplicación, está usando Theme.Styled, por ejemplo,:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Styled">

Estaba incorrecto, tengo android: theme = "@ style / Theme.Styled" en mi AndroidManifest.xml (no lo vi la primera vez).
AG1

3

Encontré este error cuando intentaba crear un DialogBox cuando se toma alguna acción dentro de la clase CustomAdapter. Esta no era una actividad sino una clase de adaptador. Después de 36 horas de esfuerzos y buscando soluciones, se me ocurrió esto.

Envíe la actividad como un parámetro mientras llama al CustomAdapter.

CustomAdapter ca = new CustomAdapter(MyActivity.this,getApplicationContext(),records);

Defina las variables en el Adaptador personalizado.

Activity parentActivity;
Context context;

Llame al constructor así.

public CustomAdapter(Activity parentActivity,Context context,List<Record> records){
    this.parentActivity=parentActivity;
    this.context=context;
    this.records=records;
}

Y finalmente, al crear el cuadro de diálogo dentro de la clase del adaptador, hágalo así.

AlertDialog ad = new AlertDialog.Builder(parentActivity).setTitle("Your title");

and so on..

Espero que esto te ayude


2

Acabo de mover mi aplicación de ActionBarSherlock a ActionBarCompat. Intenta declarar tu antiguo tema así:

<style name="Theme.Event" parent="Theme.AppCompat">

Luego configure el tema en su AndroidManifest.xml:

<application
    android:debuggable="true"
    android:name=".activity.MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Event.Home"
     >

2

Tuve tal bloqueo en los dispositivos Samsung a pesar de que la actividad usaba Theme.AppCompat . La causa raíz estaba relacionada con optimizaciones extrañas en el lado de Samsung:

- if one activity of your app has theme not inherited from Theme.AppCompat
- and it has also `android:launchMode="singleTask"`
- then all the activities that are launched from it will share the same Theme

Mi solución fue simplemente eliminar android:launchMode="singleTask"


1
¿Tiene una fuente para esto? He estado rastreando un error similar en mi aplicación durante un tiempo, y esto suena como una pista prometedora.
Dmitry Brant

¡Igual que aquí! ¡Me encantaría saber más sobre esto! También he estado rastreando un error similar en mi aplicación. Desafortunadamente, no uso android:launchMode="singleTask".
Acrespo

Observo el mismo problema. Está sucediendo para Galaxy Tab A 10.1 (Android 7.0, no rooteado y SM-A320FL (Android 7.0, no rooteado). Yo no uso android:launchMode="singleTask"y todas mis actividades usan el tema AppCompat: /
user2990759

2

en mi caso hice una vista personalizada que agregué al constructor de vista personalizada

new RoomView(getAplicationContext());

el contexto correcto es la actividad, así que lo cambié a:

new RoomView(getActivity());

o

new RoomView(this);

1

Para mi vista de lista, estoy usando un Adaptador personalizado que extiende ArrayAdapter. en listiview tengo 2 botones, uno de los botones como Custom AlertDialogBox. Ej .: Actividad parentActivity; Constructor para adaptador `

public CustomAdapter(ArrayList<Contact> data, Activity parentActivity,Context context) {
        super(context,R.layout.listdummy,data);
        this.mContext   =   context;
        this.parentActivity  =   parentActivity;
    }

`llamar al adaptador desde MainActivty

adapter = new CustomAdapter(dataModels,MainActivity.this,this);

ahora escriba su diálogo de alerta dentro de su botón que está en la clase Adaptador

viewHolder.update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
            

                AlertDialog.Builder alertDialog =   new AlertDialog.Builder(parentActivity);
                alertDialog.setTitle("Updating");
                alertDialog.setCancelable(false);

                LayoutInflater layoutInflater   = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                 @SuppressLint("InflateParams") final View view1   =   layoutInflater.inflate(R.layout.dialog,null);
                alertDialog.setView(view1);
                alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.cancel();
                    }
                });
                alertDialog.setPositiveButton("Update", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    //ur logic
                            }
                    }
                });
                  alertDialog.create().show();

            }
        });


-2

para resolver o meu problema, eu apenas adicionei na minha MainActivity ("Theme = Para resolver mi problema, acabo de agregarlo en mi MainActivity (" Theme = "@ style / MyTheme" ") donde MyTheme es el nombre de mi tema

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.