web-dev-qa-db-fra.com

ActionBarCompat: Java.lang.IllegalStateException: vous devez utiliser un thème.AppCompat

Je reçois une exception RuntimeException sur Android 2.3.5 mais je suis en utilisant Theme.AppCompat (res/values ​​/ themes.xml). . C'est 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é, j'ai aussi Android: theme = "@ style/Theme.Styled" défini dans AndroidManifest.xml.

102
AG1

Si vous étendez ActionBarActivity dans votre MainActivity, vous devrez également changer le thème parent dans values-v11.
Donc, 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 recommanderais d’arrêter d’utiliser ActionBar et de commencer à utiliser la mise en page AppBar incluse dans Android Design Support Library

96
Nishad

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

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

Cela va ajouter une actionbar dans activty (ou toutes les activités si vous avez ajouté ce thème à l'application)


Mais généralement, vous devez personnaliser votre barre d’action. Pour ce faire, vous devez créer deux styles avec le parent Theme.AppCompat, par exemple, "@ style/Theme.AppCompat.Light". La première sera pour api 11> = (versions de Android avec la version intégrée Android barre d’action), la seconde pour l’API 7-10 (aucune version 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 api 7-10. Il sera situé dans res/values ​​/ styles.xml , MAIS parce que les niveaux de l'API ne connaissent pas encore l'original Android éléments de style actionbar, nous devrions en utiliser un, fourni par la bibliothèque de support. Les éléments ActionBar Compat sont définis comme l’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'actions, vous devez toujours utiliser les styles AppCompat. Si vous ne le faites pas, vous aurez cette erreur lors du lancement d'Acitvity sur les appareils dotés de Android 3.0 et versions supérieures:

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.

P.S. Désolé pour mon anglais

66
molokoka

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

ie dossier values-v11

20
tyczj

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

Votre Activity s'étend ActionBarActivity, ce qui nécessite l'application du AppCompat.theme. Passez de ActionBarActivity à Activity ou FragmentActivity, le problème sera résolu.

11
Jorgesys

Il suffit de le construire -> Nettoyer le projet. Je pense que cela résoudra votre problème.

4
Valeriy Bilyk

J'ai rencontré cette erreur lorsque j'essayais de créer un DialogBox lorsqu'une action est entreprise dans la classe CustomAdapter. Ce n'était pas une activité, mais une classe d'adaptateurs. Après 36 heures d'efforts et de recherche de solutions, j'ai proposé ceci.

Envoyez l'activité en tant que paramètre lors de l'appel de 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 dans 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

3
Harshit Koolwal

Mon manifeste ne fait référence à aucun thème ... il ne devrait pas avoir à prendre pour autant que je sache.

Bien sûr que si. Rien ne va appliquer magiquement Theme.Styled à une activité. Vous devez déclarer 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">
3
CommonsWare

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

new RoomView(getAplicationContext());

le contexte correct est l’activité alors changez-le en:

new RoomView(getActivity());

ou

new RoomView(this);
2
amorenew

J'ai eu un tel crash sur les appareils Samsung même si l'activité utilisait Theme.AppCompat . La cause fondamentale était liée à des optimisations étranges 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 ne faisait que supprimer Android:launchMode="singleTask"

2
goRGon

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

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

Puis 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"
     >
2
Tsung Goh

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

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

`appelant adaptateur de MainActivty

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

maintenant, écrivez ur alertdialog à l’intérieur du bouton ur qui se trouve dans la classe d’adaptateur

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

            }
        });
1
Ramesh kumar