ActionBarCompat: java.lang.IllegalStateException: Sie müssen ein Theme.AppCompat verwenden


102

Ich erhalte eine Runtime auf Android 2.3.5 , aber ich bin mit Theme.AppCompat (res / Werte / themes.xml). Dies ist das Telefon: 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>

Hier ist die Datei für 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>

Hier ist der Fehler.

 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

Sorry Leute, ich habe auch android: theme = "@ style / Theme.Styled" in AndroidManifest.xml definiert.


1
Bezieht sich Ihr Manifest darauf Theme.Styled?
CommonsWare

3
Haben Sie einen anderen Werteordner, der auf Theme.Styled verweist, aber das AppCompat-Design nicht verwendet?
Tyczj

@tyczj Ich habe die Datei res / values-v11 / theme.xml hinzugefügt und sie verweist nicht auf Theme.Styled
AG1

@tyczj Sie können Ihren Kommentar als Antwort verwenden, da es ein häufiges Problem sein kann (ich auch)
Valentino Dell'Aica

Antworten:


96

Wenn Sie ActionBarActivity in Ihrer MainActivity erweitern, müssen Sie auch das übergeordnete Thema in values-v11 ändern.
Die style.xml in values-v11 lautet also -

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

BEARBEITEN: Ich würde empfehlen, dass Sie ActionBar nicht mehr verwenden und das AppBar-Layout verwenden, das in der Android Design Support Library enthalten ist


5
Ausgezeichnet, das habe ich verpasst. Vergessen Sie nicht auch alle anderen -vXX-Ordner, sonst funktioniert es in Ihrer Testumgebung einwandfrei, nur um Sie zu beißen, wenn jemand eine dieser Versionen verwendet.
Falstro

1
Vielen Dank! Gerade ActionBarActivity in Activity geändert! :)
Inoy

66

Um ActionBar Compat einfach hinzuzufügen, sollte Ihre Aktivität oder Anwendung das @ style / Theme.AppCompat-Design in AndroidManifest.xml wie folgt verwenden:

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

Dadurch wird die Aktionsleiste in der Aktivität hinzugefügt (oder alle Aktivitäten, wenn Sie dieses Thema zur Anwendung hinzugefügt haben).


Normalerweise müssen Sie jedoch Ihre Aktionsleiste anpassen. Dazu müssen Sie zwei Stile mit dem übergeordneten Thema Theme.AppCompat erstellen, z. B. "@ style / Theme.AppCompat.Light". Das erste ist für API 11> = (Versionen von Android mit integrierter Android-Aktionsleiste), das zweite für API 7-10 (keine integrierte Aktionsleiste).

Schauen wir uns den ersten Stil an. Es befindet sich in res / values-v11 / styles.xml . Es wird so aussehen:

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

Und Sie müssen den gleichen Stil für API 7-10 haben. Es befindet sich in res / values ​​/ styles.xml , ABER da die API-Ebenen noch nichts über die ursprünglichen Elemente des Android-Aktionsleistenstils wissen, sollten wir eines verwenden, das von der Support-Bibliothek bereitgestellt wird. ActionBar Compat-Elemente werden wie das ursprüngliche Android definiert, jedoch ohne "android:" - Teil vorne:

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

Bitte markieren Sie, dass Sie auch dann AppCompat-Stile verwenden sollten, wenn API-Level über 10 bereits über eine Aktionsleiste verfügen. Wenn Sie dies nicht tun, wird dieser Fehler beim Start von Acitvity auf Geräten mit Android 3.0 und höher angezeigt:

java.lang.IllegalStateException: Sie müssen für diese Aktivität ein Theme.AppCompat-Design (oder einen Nachkommen) verwenden.

Hier ist der Link zu diesem Originalartikel http://android-developers.blogspot.com/2013/08/actionbarcompat-and-io-2013-app-source.html, geschrieben von Chris Banes.

PS Entschuldigung für mein Englisch


geschafft! UPVPTED
Tony Gil

20

Stellen Sie sicher, dass Sie keinen anderen Werteordner haben, der auf theme.styled verweist und kein AppCompat-Design verwendet

dh values-v11Ordner


Das war auch mein Problem. Ich hatte ein Bibliotheksprojekt und musste die appcompat-v7-Bibliothek importieren und alle Themen AppCompat-Themen erweitern lassen. Die Sache ist, mein Hauptprojekt hat die Tools: replace = "android: icon, android: theme" Option zur <Anwendung> hinzugefügt und sollte Stile aus anderen Projekten weglassen. Aus irgendeinem Grund funktionierte das nicht.
Speedynomads

16

Versuche dies...

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

Ihr Activityerweitert, ActionBarActivitywas erfordert AppCompat.theme, dass das angewendet wird. Wechseln Sie von ActionBarActivityzu Activityoder FragmentActivity, um das Problem zu lösen.


4

Mach es einfach Build -> Clean Project. Ich denke, das wird Ihr Problem lösen.


3

Mein Manifest bezieht sich nicht auf Themen ... es sollte nicht AFAIK sein müssen

Sicher tut es das. Nichts wird auf magische Weise Theme.Styledauf eine Aktivität zutreffen . Sie müssen angeben, dass Ihre Aktivitäten - oder Ihre gesamte Anwendung - Folgendes verwenden Theme.Styled: z.

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

Ich war falsch, ich habe android: theme = "@ style / Theme.Styled" in meiner AndroidManifest.xml (ich habe es nicht das erste Mal gesehen).
AG1

3

Dieser Fehler ist aufgetreten, als ich versucht habe, eine Dialogbox zu erstellen, wenn innerhalb der CustomAdapter-Klasse eine Aktion ausgeführt wurde. Dies war keine Aktivität, sondern eine Adapterklasse. Nach 36 Stunden Anstrengung und der Suche nach Lösungen kam ich auf diese Idee.

Senden Sie die Aktivität als Parameter, während Sie den CustomAdapter aufrufen.

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

Definieren Sie die Variablen im benutzerdefinierten Adapter.

Activity parentActivity;
Context context;

Rufen Sie den Konstruktor so auf.

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

Und schließlich, wenn Sie das Dialogfeld innerhalb der Adapterklasse erstellen, gehen Sie wie folgt vor.

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

and so on..

ich hoffe das hilft dir


2

Ich habe gerade meine Anwendung von ActionBarSherlock nach ActionBarCompat verschoben. Versuchen Sie, Ihr altes Thema folgendermaßen zu deklarieren:

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

Legen Sie dann das Thema in Ihrer AndroidManifest.xml fest:

<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

Ich hatte einen solchen Absturz auf Samsung- Geräten, obwohl die Aktivität Theme.AppCompat verwendete . Die Hauptursache lag in seltsamen Optimierungen auf Samsung-Seite:

- 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

Meine Lösung war nur das Entfernen android:launchMode="singleTask"


1
Hast du eine Quelle dafür? Ich habe eine Weile einen ähnlichen Fehler in meiner App aufgespürt, und das klingt nach einem vielversprechenden Hinweis.
Dmitry Brant

Hier gilt das gleiche! Würde gerne mehr darüber erfahren! Ich habe auch einen ähnlichen Fehler in meiner App aufgespürt. Leider benutze ich nicht android:launchMode="singleTask".
Acrespo

Ich beobachte das gleiche Problem. Es passiert für Galaxy Tab A 10.1 (Android 7.0, nicht gerootet und SM-A320FL (Android 7.0, nicht gerootet). Ich benutze nicht android:launchMode="singleTask"und alle meine Aktivitäten verwenden AppCompat-Thema: /
user2990759

2

in meinem Fall habe ich eine benutzerdefinierte Ansicht i zu benutzerdefinierten Ansicht hinzugefügt Konstruktor

new RoomView(getAplicationContext());

Der richtige Kontext ist Aktivität. Ändern Sie ihn in:

new RoomView(getActivity());

oder

new RoomView(this);

1

Für meine Listenansicht verwende ich einen benutzerdefinierten Adapter, der ArrayAdapter erweitert. In der Listenansicht habe ich 2 Schaltflächen, eine der Schaltflächen als benutzerdefinierte AlertDialogBox. Beispiel: Aktivität parentActivity; Konstruktor für Adapter `

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

`Adapter von MainActivty aufrufen

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

Schreiben Sie jetzt Ihren Alarmdialog in die Schaltfläche, die sich in der Adapterklasse befindet

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 = Um mein Problem zu lösen, habe ich es einfach in meine MainActivity (" Theme = "@ style / MyTheme" ") eingefügt, wobei MyTheme der Name meines Themas ist

[Activity(Label = "Name Label", MainLauncher = true, Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, Theme = "@style/MyTheme")]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.