ActionBarCompat: java.lang.IllegalStateException: vous devez utiliser un Theme.AppCompat

102

Je reçois un RuntimeException sur Android 2.3.5 mais je suis utilise Theme.AppCompat (res / valeurs / themes.xml). Voici le téléphone: 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>

Voici le fichier pour 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>

Voici l'erreur.

 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

Désolé les gens, j'ai aussi android: theme = "@ style / Theme.Styled" défini dans AndroidManifest.xml.

AG1
la source
1
Votre référence manifeste Theme.Styled?
CommonsWare
3
avez-vous un autre dossier de valeurs qui fait référence à Theme.Styled mais n'utilise pas le thème AppCompat?
tyczj
@tyczj J'ai ajouté le fichier res / values-v11 / themes.xml et il ne fait pas référence à Theme.Styled
AG1
@tyczj Vous pouvez utiliser votre commentaire comme réponse car cela peut être un problème courant (moi aussi)
Valentino Dell'Aica

Réponses:

96

Si vous étendez ActionBarActivity dans votre MainActivity, vous devrez également changer le thème parent dans values-v11.
Ainsi, le style.xml dans values-v11 sera -

 <!-- 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>

EDIT: Je vous recommande d'arrêter d'utiliser ActionBar et de commencer à utiliser la disposition AppBar incluse dans la bibliothèque de support de conception Android

Nishad
la source
5
Excellent, j'ai raté ça. N'oubliez pas non plus tous les autres dossiers -vXX, ou cela fonctionnera correctement dans votre environnement de test, seulement pour vous mordre une fois que quelqu'un utilise l'une de ces versions.
falstro
1
Merci! Je viens de changer ActionBarActivity en Activity! :)
Inoy
66

Pour simplement ajouter ActionBar Compat, votre activité ou application doit utiliser le thème @ style / Theme.AppCompat dans AndroidManifest.xml comme ceci:

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

Cela ajoutera une barre d'action dans l'activité (ou toutes les activités si vous avez ajouté ce thème à l'application)


Mais généralement, vous devez personnaliser votre barre d'actions. Pour ce faire, vous devez créer deux styles avec le parent Theme.AppCompat, par exemple "@ style / Theme.AppCompat.Light". Le premier sera pour api 11> = (versions d'Android avec build dans la barre d'action Android), le second pour api 7-10 (pas de build dans la barre d'action).

Regardons le premier style. Il sera situé dans res / values-v11 / styles.xml . Il ressemblera à ceci:

<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>

Et vous devez avoir le même style pour l'API 7-10. Il sera situé dans res / values ​​/ styles.xml , MAIS parce que les niveaux d'API ne connaissent pas encore les éléments de style de la barre d'action Android d'origine, nous devrions en utiliser un, fourni par la bibliothèque de support. Les éléments de compatibilité ActionBar sont définis comme Android d'origine, mais sans la partie "android:" à l'avant:

<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>

Veuillez noter que, même si les niveaux d'API supérieurs à 10 ont déjà une barre d'action, vous devez toujours utiliser les styles AppCompat. Si vous ne le faites pas, vous aurez cette erreur au lancement d'Acitvity sur les appareils avec Android 3.0 et supérieur:

java.lang.IllegalStateException: Vous devez utiliser un thème Theme.AppCompat (ou un descendant) avec cette activité.

Voici le lien de cet article original http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html écrit par Chris Banes.

PS Désolé pour mon anglais

molokoka
la source
j'y suis arrivé! UPVPTED
tony gil
20

Vérifiez et assurez-vous que vous n'avez pas d'autre dossier de valeurs qui fait référence à theme.styled et n'utilise pas le thème AppCompat

ie values-v11dossier

tyczj
la source
C'était aussi mon problème. J'avais un projet de bibliothèque et j'ai dû importer la bibliothèque appcompat-v7 et faire en sorte que tous les thèmes étendent les thèmes AppCompat. Le fait est que mon projet principal a les outils: replace = "android: icon, android: theme" option ajoutée à <application> et devrait laisser de côté les styles d'autres projets. Pour une raison quelconque, cela ne fonctionnait pas.
speedynomads
16

Essaye ça...

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>
Silambarasan Poonguti
la source
11

Votre Activityest en train d'étendre, ActionBarActivityce qui nécessite l' AppCompat.themeapplication. Passer de ActionBarActivityà Activityou FragmentActivity, cela résoudra le problème.

Jorgesys
la source
4

Faites-le simplement Build -> Clean Project. Je pense que cela résoudra votre problème.

Valeriy Bilyk
la source
3

Mon manifeste ne fait référence à aucun thème ... il ne devrait pas avoir à AFAIK

Bien sûr que oui. Rien ne s'appliquera comme par magie Theme.Styledà une activité. Vous devez déclarer que vos activités - ou l'ensemble de votre application - utilise Theme.Styled, par exemple:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Styled">
CommonsWare
la source
J'étais incorrect, j'ai android: theme = "@ style / Theme.Styled" dans mon AndroidManifest.xml (je ne l'ai pas vu la première fois).
AG1
3

J'ai rencontré cette erreur lorsque j'essayais de créer une boîte de dialogue lorsqu'une action est entreprise dans la classe CustomAdapter. Ce n'était pas une activité mais une classe d'adaptateur. Après 36 heures d'efforts et à la recherche de solutions, j'ai trouvé ça.

Envoyez l'activité en tant que paramètre lors de l'appel du CustomAdapter.

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

Définissez les variables dans l'adaptateur personnalisé.

Activity parentActivity;
Context context;

Appelez le constructeur comme ceci.

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

Et enfin, lors de la création de la boîte de dialogue à l'intérieur de la classe d'adaptateur, procédez comme suit.

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

and so on..

J'espère que ceci vous aide

Harshit Koolwal
la source
2

Je viens de faire passer mon application d'ActionBarSherlock à ActionBarCompat. Essayez de déclarer votre ancien thème comme ceci:

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

Ensuite, définissez le thème dans votre 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"
     >
Tsung Goh
la source
2

J'ai eu un tel crash sur les appareils Samsung même si l'activité utilisait Theme.AppCompat . La cause première était liée à d'étranges optimisations du côté 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

Ma solution était juste de supprimer android:launchMode="singleTask"

goRGon
la source
1
Avez-vous une source pour cela? Je traque un bug similaire dans mon application depuis un moment, et cela semble être une piste prometteuse.
Dmitry Brant
Pareil ici! J'adorerais en savoir plus à ce sujet! J'ai également détecté un bug similaire dans mon application. Malheureusement, je ne l'utilise pas android:launchMode="singleTask".
acrespo
J'observe le même problème. Cela se passe pour Galaxy Tab A 10.1 (Android 7.0, non rooté et SM-A320FL (Android 7.0, non rooté). Je n'utilise pas android:launchMode="singleTask"et toutes mes activités utilisent le thème AppCompat: /
user2990759
2

dans mon cas, j'ai créé une vue personnalisée que j'ai ajoutée au constructeur de vue personnalisée

new RoomView(getAplicationContext());

le contexte correct est l'activité, alors l'avez changé en:

new RoomView(getActivity());

ou

new RoomView(this);
amorenouveau
la source
1

Pour ma vue de liste, j'utilise un adaptateur personnalisé qui étend ArrayAdapter. dans listiview j'ai 2 boutons l'un des boutons comme Custom AlertDialogBox. Ex: Activité parentActivity; Constructeur pour l'adaptateur `

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

`appelant l'adaptateur depuis MainActivty

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

écrivez maintenant ur alertdialog à l'intérieur du bouton ur qui est dans la classe Adapter

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();

            }
        });

Ramesh Kumar
la source
-2

pour résolveur de problème, eu apenas adicionei na minha MainActivity ("Theme = Pour résoudre mon problème, je viens de l'ajouter dans ma MainActivity (" Theme = "@ style / MyTheme" ") où MyTheme est le nom de mon thème

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Deyvidy
la source