ActionBarCompat: java.lang.IllegalStateException: è necessario utilizzare un Theme.AppCompat


102

Ricevo una RuntimeException su Android 2.3.5 ma sto usando Theme.AppCompat (res / values ​​/ themes.xml). Questo è il telefono: 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>

Ecco il file per 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>

Ecco l'errore.

 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

Scusate gente, ho anche android: theme = "@ style / Theme.Styled" definito in AndroidManifest.xml.


1
Il tuo manifesto fa riferimento Theme.Styled?
CommonsWare

3
hai un'altra cartella di valori che fa riferimento a Theme.Styled ma non usa il tema AppCompat?
tyczj

@tyczj Ho aggiunto il file res / values-v11 / themes.xml e non fa riferimento a Theme.Styled
AG1

@tyczj Puoi usare il tuo commento come risposta poiché può essere un problema comune (anche a me)
Valentino Dell'Aica

Risposte:


96

Se estendi ActionBarActivity nella tua MainActivity, dovrai cambiare anche il tema principale in values-v11.
Quindi il file style.xml in values-v11 sarà -

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

MODIFICA: ti consiglio di smettere di usare ActionBar e iniziare a utilizzare il layout AppBar incluso nella libreria di supporto per la progettazione Android


5
Eccellente, mi sono perso questo. Non dimenticare anche tutte le altre cartelle -vXX, o funzionerà bene nell'ambiente di prova, solo per morderti quando qualcuno usa una di quelle versioni.
falstro

1
Grazie! Ho appena cambiato ActionBarActivity in Activity! :)
Inoy

66

Per aggiungere semplicemente ActionBar Compat la tua attività o applicazione dovresti usare il tema @ style / Theme.AppCompat in AndroidManifest.xml in questo modo:

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

Questo aggiungerà la barra delle azioni in activty (o tutte le attività se hai aggiunto questo tema all'applicazione)


Ma di solito è necessario personalizzare la barra delle azioni. Per fare ciò è necessario creare due stili con il genitore Theme.AppCompat, ad esempio "@ style / Theme.AppCompat.Light". Il primo sarà per api 11> = (versioni di Android con build in android actionbar), il secondo per api 7-10 (nessuna build in actionbar).

Diamo un'occhiata al primo stile. Si troverà in res / values-v11 / styles.xml . Sarà simile a questo:

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

E devi avere lo stesso stile per api 7-10. Si troverà in res / values ​​/ styles.xml , MA poiché i livelli api non conoscono ancora gli elementi di stile della barra di azione Android originali, dovremmo usarne uno, fornito dalla libreria di supporto. Gli elementi di ActionBar Compat sono definiti come Android originale, ma senza la parte "android:" nella parte anteriore:

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

Si prega di contrassegnare che, anche se i livelli API superiori a 10 hanno già una barra delle azioni, è comunque necessario utilizzare gli stili AppCompat. In caso contrario, verrà visualizzato questo errore all'avvio di Acitvity su dispositivi con Android 3.0 e versioni successive:

java.lang.IllegalStateException: è necessario utilizzare un tema Theme.AppCompat (o discendente) con questa attività.

Ecco il link a questo articolo originale http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html scritto da Chris Banes.

PS Scusa per il mio inglese


azzeccato! UPVPTED
tony gil

20

Controlla e assicurati di non avere un'altra cartella di valori che fa riferimento a theme.styled e non utilizza il tema AppCompat

cioè values-v11cartella


Questo era anche il mio problema. Avevo un progetto di libreria e dovevo importare la libreria appcompat-v7 e fare in modo che tutti i temi estendessero i temi di AppCompat. Il fatto è che il mio progetto principale ha l'opzione tools: replace = "android: icon, android: theme" aggiunta a <application> e dovrebbe escludere gli stili di altri progetti. Per qualche motivo non funzionava.
speedynomads

16

Prova questo...

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

Il tuo si Activitysta estendendo ActionBarActivityche richiede l' AppCompat.themeapplicazione. Cambia da ActionBarActivitya Activityo FragmentActivity, risolverà il problema.


4

Basta farlo Build -> Clean Project. Penso che questo risolverà il tuo problema.


3

Il mio manifest non fa riferimento ad alcun tema ... non dovrebbe avere per AFAIK

Certo che lo fa. Niente si applicherà magicamente Theme.Styleda un'attività. Devi dichiarare che le tue attività, o l'intera applicazione, stanno utilizzando Theme.Styled, ad esempio:

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

Ho sbagliato, ho android: theme = "@ style / Theme.Styled" nel mio AndroidManifest.xml (non l'ho visto la prima volta).
AG1

3

Ho riscontrato questo errore durante il tentativo di creare un DialogBox quando viene eseguita un'azione all'interno della classe CustomAdapter. Questa non era un'attività ma una classe Adapter. Dopo 36 ore di sforzi e cercando soluzioni, ho pensato a questo.

Invia l'attività come parametro durante la chiamata a CustomAdapter.

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

Definisci le variabili nell'adattatore personalizzato.

Activity parentActivity;
Context context;

Chiama il costruttore in questo modo.

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

E infine, quando crei la finestra di dialogo all'interno della classe dell'adattatore, fallo in questo modo.

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

and so on..

Spero che questo ti aiuta


2

Ho appena fatto spostare la mia applicazione da ActionBarSherlock ad ActionBarCompat. Prova a dichiarare il tuo vecchio tema in questo modo:

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

Quindi imposta il tema nel tuo 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

Ho avuto un tale arresto anomalo sui dispositivi Samsung anche se l'attività utilizzava Theme.AppCompat . La causa principale era correlata a strane ottimizzazioni sul lato 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

La mia soluzione era solo rimuovere android:launchMode="singleTask"


1
Hai una fonte per questo? Ho rintracciato un bug simile nella mia app per un po 'e questo sembra un vantaggio promettente.
Dmitry Brant,

Anch'io! Mi piacerebbe saperne di più! Ho anche rintracciato un bug simile nella mia app. Purtroppo non lo uso android:launchMode="singleTask".
acrespo

Osservo lo stesso problema. Sta accadendo per Galaxy Tab A 10.1 (Android 7.0, non rootato e SM-A320FL (Android 7.0, non rootato). Non utilizzo android:launchMode="singleTask"e tutte le mie attività utilizzano il tema AppCompat: /
user2990759

2

nel mio caso ho creato una vista personalizzata che ho aggiunto al costruttore della vista personalizzata

new RoomView(getAplicationContext());

il contesto corretto è l'attività, quindi è stato modificato in:

new RoomView(getActivity());

o

new RoomView(this);

1

Per la mia visualizzazione elenco sto usando un adattatore personalizzato che estende ArrayAdapter. in listiview ho 2 pulsanti uno dei pulsanti come Custom AlertDialogBox. Es: attività parentActivity; Costruttore per adattatore `

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

`calling Adapter da MainActivty

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

ora scrivi il tuo alertdialog all'interno del tuo pulsante che è nella 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();

            }
        });


-2

para resolver o meu problema, eu apenas adicionei na minha MainActivity ("Theme = Per risolvere il mio problema, l'ho appena aggiunto nella mia MainActivity (" Theme = "@ style / MyTheme" ") dove MyTheme è il nome del mio tema

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.