Sie müssen für diese Aktivität ein Theme.AppCompat-Thema (oder einen Nachkommen) verwenden


1004

Android Studio 0.4.5

Android-Dokumentation zum Erstellen benutzerdefinierter Dialogfelder: http://developer.android.com/guide/topics/ui/dialogs.html

Wenn Sie ein benutzerdefiniertes Dialogfeld möchten, können Sie stattdessen eine Aktivität als Dialogfeld anzeigen, anstatt die Dialog-APIs zu verwenden. Erstellen Sie einfach eine Aktivität und setzen Sie das Thema im <activity>Manifest-Element auf Theme.Holo.Dialog :

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

Als ich dies versuchte, bekam ich jedoch die folgende Ausnahme:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity

Ich unterstütze Folgendes und kann für die Minute nicht mehr als 10 verwenden:

minSdkVersion 10
targetSdkVersion 19

In meinen Stilen habe ich Folgendes:

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

Und in meinem Manifest habe ich dies für die Aktivität:

 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:theme="@android:style/Theme.Holo.Light.Dialog"
            android:name="com.ssd.register.Dialog_update"
            android:label="@string/title_activity_dialog_update" >
        </activity>

Das Erstellen des Dialogfelds wie dieses war etwas, zu dem ich hüpfen wollte, da ich das Layout bereits fertiggestellt habe.

Kann mir jemand sagen, wie ich dieses Problem umgehen kann?


2
@Raghunandan, ich bin neu in diesem Bereich, aber wenn ich mir meine Stile ansehe, habe ich Folgendes: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> Und ich habe die folgenden Importe: import android.support.v7 .app.ActionBarActivity; import android.support.v7.app.ActionBar; android.support.v4.app.Fragment importieren; Aber nicht sicher, was das alles bedeutet.
Ant2009

10
Sie verwenden AppCompatdie Support-Bibliothek, um Aktionsleisten unterhalb der API-Ebene 11 zu unterstützen. Verwenden Sie sie einfach android:theme="@style/AppTheme" >für die Aktivität im Manifest
Raghunandan,

2
@ ant2009, um zu klären, was @Raghunandan gesagt hat: In Ihrem AndroidManifest.xmlThema überschreibt das Thema, das Sie für Ihre Aktivität angeben , das Thema, das Sie für Ihre Anwendung angeben . Entfernen Sie die android:themeLinie vom <activity>Tag.
Cryptochronoconolite

3
Dadurch wird der Fehler behoben, aber nicht dorthin gebracht, wo er sein möchte. Dies ist eine Aktivität mit einem Dialogthema. Die allgemeine Regel lautet: Wenn Ihre Aktivität eine Aktionsleiste haben soll, sollte sie das AppCompat-Design haben und der Java-Code sollte ActionBarActivity erweitern. Wenn Sie eine Aktivität haben, für die keine Aktionsleiste erforderlich ist (z. B. eine Aktivität zum Thema Dialog), können Sie ein beliebiges Thema darauf anwenden, der Java-Code muss jedoch die einfache alte Aktivität erweitern.
Bobbake4

1
Ich denke, das einzige Problem in diesem Fall ist der Kontext, den Sie für den Dialog-Konstruktor bereitstellen. Siehe meine Antwort. stackoverflow.com/a/51574281/232727
Vitaliy A

Antworten:


1124

Der Grund für dieses Problem liegt darin, dass die Aktivität, auf die Sie das Dialogthema anwenden möchten, erweitert wird und ActionBarActivitydas AppCompatThema angewendet werden muss.

Update : Erweitern AppCompatActivityhätte auch dieses Problem

Ändern Sie in diesem Fall die Java-Vererbung von ActionBarActivitynach Activityund lassen Sie das Dialogfeldthema im Manifest unverändert, ein Nicht- Theme.AppCompatWert


Die allgemeine Regel lautet: Wenn Ihr Code ältere Android-Versionen unterstützen soll, sollte er das AppCompatThema haben und der Java-Code sollte erweitert werden AppCompatActivity. Wenn Sie * eine Aktivität haben, die diese Unterstützung nicht benötigt, z. B. wenn Sie sich nur um die neuesten Versionen und Funktionen von Android kümmern, können Sie ein beliebiges Thema darauf anwenden, aber der Java-Code muss einfach alt sein Activity.


HINWEIS: Beim Wechsel von AppCompatActivity(oder einer Unterklasse ActionBarActivity) zu Activitymüssen auch die verschiedenen Anrufe mit "Unterstützung" in den entsprechenden Anruf ohne "Unterstützung" geändert werden . Also statt getSupportFragmentManageranrufen getFragmentManager.


6
op verwendet appcompat. In diesem Fall sollte er erweitern ActionBarActivity, was aus seinen Importanweisungen aus dem Kommentar unter der Frage hervorgeht.
Raghunandan

2
@Bursos Wenn Sie beim Erstellen eines neuen Projekts in Android Studio darüber sprechen, ist dies vermutlich ein Fehler in der Standardkonfiguration.
Bobbake4

2
@ Bobbake4, ich habe das gleiche Problem, und diese Lösung ist unmöglich für mich zu arbeiten. Die Sache ist, dass ich Activity nicht erweitern kann, weil ich eine Reihe von Klassen (ganzes Projekt) habe, die auf ActionBarActivity basieren. Gibt es eine andere Lösung für das Problem? Thx
5er

6
@ 5er Wenn Ihr Java ActionBarActivity verwendet, muss das Design Theme.AppCompat erweitern. Es gibt eine Handvoll integrierter Themen, die Theme.AppCompat erweitern, oder Sie können es selbst erweitern und ändern. Ohne das übergeordnete ActionBarActivity-Element können Sie das Theme.AppCompat nicht umgehen.
Bobbake4

26
Im Stil <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> löste dies mein Problem. :)
Harmeet Singh

545

Alles, was Sie tun müssen, ist android:theme="@style/Theme.AppCompat.Light", Ihrem Anwendungs-Tag in der AndroidManifest.xmlDatei etwas hinzuzufügen .


2
Im Code hat ant2009 AppTheme als Anwendung festgelegt, die sich von einem Nachkommen von Theme.AppCompat erstreckt. Das sollte funktionieren. Ich hatte das gleiche Problem nach dem Upgrade auf 5.0 auf meinem Gerät und stellte schließlich @ style / Theme.AppCompat.Light als Thema für meine Aktivität ein. Etwas stimmt hier nicht ...
Speedynomads

36
Dies ist keine gültige Antwort für Android Studio, obwohl es in einigen Fällen als schnelle Lösung funktioniert, wenn die Dateien styles.xml umgangen werden. In Android Studio können Sie das Thema ordnungsgemäß definieren, indem Sie es in den Dateien styles.xml definieren. Anschließend verweist die Android-Menifestdatei lediglich auf sie und wählt sie basierend auf der Android-Version aus, die Sie auf Ihrem Gerät ausführen. Normalerweise ist es auf android gesetzt: theme = "@ style / AppTheme" und dieses AppTheme verweist auf <style name = "Theme.AppTheme" parent = "Theme.AppCompat.Light"> in styles.xml
zeeshan

5
Das hat bei mir nicht wirklich funktioniert, weil meine
Titelleisten

1
Ist auch mit der SnackBar auf dieses Problem gestoßen. Dies löste mein Problem.
arbeitete

2
@Martin Wenn Sie wie ich sind, haben Sie vergessen, in der allgemeinen Datei styles.xml denselben Stilnamen hinzuzufügen wie in der Datei (V21) styles.xml (ohne die für V21 spezifischen Eigenschaften). Wenn Sie einen Stil im V21-Ordner deklarieren und Ihr Gerät eine Version unten hat. Es kann es nicht finden, daher wird eine Ausnahme ausgelöst.
Letroll

275

Kopieren der Antwort von @MarkKeen in den obigen Kommentaren, da ich das gleiche Problem hatte.

Ich hatte den Fehler oben im Beitrag angegeben und trat auf, nachdem ich einen Warndialog hinzugefügt hatte. Ich habe alle relevanten Stilinformationen im Manifest. Mein Problem wurde behoben, indem eine Kontextreferenz im Alert Builder geändert wurde. Ich habe Folgendes geändert:

new android.support.v7.app.AlertDialog.Builder(getApplicationContext())

zu:

new android.support.v7.app.AlertDialog.Builder(this)

Und keine Probleme mehr.


5
Das ist mir auch passiert. Ich habe es nur versucht und deine Antwort hat wirklich funktioniert! Was ist die Logik dafür, dass es funktioniert? Ich habe es wirklich nicht verstanden.
Kirtan403

6
Wenn Sie Ihren AlertDialog in einem Fragment und nicht direkt in einer Aktivität erstellen, verwenden Sie ihn getActivity()nicht thiswie oben vorgeschlagen, und das Problem ist behoben. Was den Grund angeht, kann ich nur vermuten, dass der ältere AlertDialog.Builder (xxx) -Code entweder einen anderen Typ übergeben wollte oder einfach weniger wählerisch war, was übergeben wurde, während der aktuelle Builder () wirklich, wirklich eine Aktivität wünscht. Da Google beschlossen hat, die Dokumentation für den alten Code auszublenden (zu entfernen?), Vermutlich um die Verwendung der Version v7.app zu fördern, kann ich dies nicht mit Sicherheit sagen.
Anne Gunn

Habe das Gegenteil von dem, was vorgeschlagen wird. Und es hat funktioniert: P. Vielen Dank!
Harisewak

1
Dies löst das Programm für mich, das Sie auch verwenden würden, getContext()anstatt sich thisin einem ArrayAdapter oder einer ähnlichen Adapterklasse zu befinden.
Ibrahim.H

1
Dies ist die echte Lösung, die ich jemals getroffen habe. TIPP: Bitte erwähnen Sie den Unterschied in getApplicationContext () und dies in diesem Zweck.
Prazeev

109

min sdk is 10. ActionBarist ab API-Level 11 verfügbar. Für 10 würden Sie also AppCompataus der Support-Bibliothek verwenden, für die Sie diese verwenden müssen, Theme.AppCompatoder deren Nachkommen.

Verwenden

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

Oder wenn Sie keine Aktionsleiste oben möchten

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

Mehr Info @

http://developer.android.com/guide/topics/ui/actionbar.html

Bearbeiten:

Ich habe den Beitrag möglicherweise falsch gelesen.

Scheint op möchte einen Dialog mit einem Aktivitätsthema. Also wie schon von Bobbake4 vorgeschlagen verlängern Activitystatt ActionBarActivity.

Schauen Sie sich auch die @ Dialog-Attribute unter dem folgenden Link an

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/frameworks/base/core/res/res/values/themes.xml/


Danke für den Vorschlag. Das habe ich eigentlich schon versucht. Und ich habe das gleiche Problem. Meine Stildatei sieht folgendermaßen aus: <style name = "AppTheme" parent = "Theme.AppCompat">
ant2009

@ ant2009 wirst du nicht. Verwenden Sie ein Thema aus der Support-Bibliothek AppCompat für Ihre Aktivität
Raghunandan

Ich bin nicht sicher, ob ich dieses Thema richtig hinzufüge. Aber meinen Sie damit, die folgende Importanweisung hinzuzufügen? import android.support.v7.appcompat. *; Allerdings habe ich das versucht und vielleicht irre ich mich, da ich immer noch die gleiche Ausnahme hatte.
Ant2009

@ ant2009 Sie können einen benutzerdefinierten Dialog haben. Aber möchten Sie den Vollbilddialog?
Raghunandan

Ich wollte es nicht im Vollbildmodus haben. Nur ein Dialogfeld. Das Problem ist jedoch jetzt gelöst. Bobbake4 hat es richtig gemacht. Trotzdem vielen Dank für Ihre Bemühungen, Sie haben nützliche Ratschläge gegeben. Ich bin jedoch immer noch verwirrt mit all dieser Support-Bibliothek und AppCompat.
Ant2009

99

Wenn Sie den Anwendungskontext wie folgt verwenden:

final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

Ändern Sie es in einen Aktivitätskontext wie diesen:

final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

Wenn Sie LayoutInflater.from (<Anwendungskontext>) verwenden, stellen Sie sicher, dass Sie den Aktivitätskontext oder den bereitgestellten LayoutInflater verwenden, damit er das richtige Thema erbt.
Lbarbosa

1
Ihre Lösung hat mir in meinem Fall geholfen. Können Sie erklären, welchen Unterschied zwischen getApplicationContext () und MainActivity.this besteht?
Kostyabakay


9
Sie benötigen eine Aktivität, keinen Kontext, um Dialoge anzuzeigen
siehe

Diese Lösung löst es
Mohamed Amin

45

Ich hatte dieses Problem, obwohl mein Thema ein AppCompatThema war und meine Aktivität ein AppCompatActivity(oder Activity, wie in den Antworten anderer vorgeschlagen). Also habe ich das Projekt gereinigt, neu aufgebaut und erneut ausgeführt.

( Erstellen -> Projekt bereinigen; Erstellen -> Projekt neu erstellen; Ausführen -> Ausführen )

Es mag dumm erscheinen, aber jetzt funktioniert es großartig !

Hoffe nur, dass es hilft!


1
Hatte genau die gleiche Nachricht, nachdem DialogFragment zur AppCompat-Aktivität hinzugefügt wurde. Datei, Caches ungültig machen / Neustart behoben, dass zur Not.
halxinate

2
Ich habe fast alle Antworten in diesem Thread ausprobiert. aber nur diese scheinbar "dumme" Antwort funktioniert. Vielen Dank!
Dika

27

Dies hat es für mich behoben: Anstatt das Thema im Manifest anzugeben, habe ich es onCreatefür jede Aktivität definiert, die sich erstreckt ActionBarActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.MyAppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity_layout);
...
}

Hier MyAppThemeist ein Nachkomme von Theme.AppCompatund wird in XML definiert. Beachten Sie, dass das Thema vor super.onCreateund festgelegt werden muss setContentView.


1
Robolectric löst beim Laden der Ressource eine NullPointerException in der Zeile setTheme aus. Irgendeine Idee warum?
Rhys Davis

@RhysDavis Schwer zu sagen ohne Stack-Trace, aber vielleicht will es zuerst setContentView? In diesem Fall funktioniert dieses Update nicht für Sie.
29.

19

Gehen Sie zu Ihren Stilen und setzen Sie die Eltern

parent="Theme.AppCompat"

anstatt

parent="@android:style/Theme.Holo.Light"

Warum können wir dies mit einer Standardaktivität tun? Hat Android Standardaktivitäten mit ICS oder Honecomb nicht mit Aktionsleisten versehen? Müssen wir immer ActionBarActivity verwenden, wenn wir unser Mindestziel auf SDK ICS festlegen?
Andrew S

wie man sieht, welches Thema wir mit dem Typ oder der Funktion verwenden sollen, die wir verwenden, weil wir beim Importieren alle Arten von Themen zur Verfügung haben
blackHawk

16

In meinem Fall habe ich keine Datei values-v21 in meinem res-Verzeichnis. Dann habe ich es erstellt und folgende Codes hinzugefügt:

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Ich habe mein Projekt auf Oreo + -Geräten ausgeführt und nur das hat bei mir funktioniert.
Nishant Soni

16

Ändern Sie das Thema der gewünschten Aktivität. Das funktioniert bei mir:

<activity
            android:name="HomeActivity"
            android:screenOrientation="landscape"
            android:theme="@style/Theme.AppCompat.Light"
            android:windowSoftInputMode="stateHidden" />

14

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 zu entfernen android:launchMode="singleTask"


2
Ich bin auch darauf gestoßen, habe den Fix nicht validiert und kann den Fehler nicht reproduzieren. Aber ich sehe diesen Fehler nur auf Samsung-Geräten in freier Wildbahn. Die meisten scheinen ebenfalls verwurzelt zu sein, fwiw
danb

Ich hatte den Fehler oben im Beitrag angegeben und trat auf, nachdem ich einen Warndialog hinzugefügt hatte. Ich habe alle relevanten Stilinformationen im Manifest. Mein Problem wurde behoben, indem eine Kontextreferenz im Alert Builder geändert wurde. Ich habe Folgendes geändert: new android.support.v7.app.AlertDialog.Builder (getApplicationContext ()) in: new android.support.v7.app.AlertDialog.Builder (this ) und keine Probleme mehr ...
Mark Keen

Haben Sie weitere Details oder Links zu Samsung zu dieser Optimierung? Müssen dann alle Aktivitäten Theme.AppCompat implementieren oder kann es Aktivitäten ohne Thema geben?
AAverin

13

Wenn Sie ActionBarActivity erweitern müssen, benötigen Sie für Ihre style.xml:

<!-- Base application theme. -->
<style name="AppTheme" parent="AppTheme.Base"/>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->

Wenn Sie als Hauptthema Ihrer Anwendung android: Theme.Material.Light anstelle von AppTheme.Base festlegen , wird die Fehlermeldung "IllegalStateException: Sie müssen für diese Aktivität ein Theme.AppCompat-Design (oder einen Nachkommen) für diese Aktivität verwenden" angezeigt.


13

Mach einfach

new AlertDialog.Builder(this)

Anstatt

new AlertDialog.Builder(getApplicationContext())

Arbeitslösung! 30 Minuten, um dies mit dieser Antwort herauszufinden. Warum verwende ich den neuen AlertDialog.Builder (getApplicationContext ())?
Erich García

Es wird hilfreich sein zu erklären, welcher Typ thiserwartet wird.
Blago

12

Ich hatte das gleiche Problem, aber es wurde gelöst, als ich dies auf manifest stellte: android: theme = "@ style / Theme.AppCompat.

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name_test"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat">

        ...    

    </application>

10

In meinem Fall trat ein solches Problem auf, als ich versuchte, Dialog anzuzeigen. Das Problem war im Kontext, ich habe getBaseContext () verwendet, das theoretisch den Aktivitätskontext zurückgeben sollte, aber nicht angezeigt wird, oder es gibt den Kontext zurück, bevor ein Thema angewendet wird.

Also habe ich getBaseContexts () durch " this " ersetzt und jetzt funktioniert es wie erwartet.

        Dialog.showAlert(this, title, message,....);

Ich habe getApplicaitonContext () übergeben, aber deine hat es geschafft
Jeeva

9

Ich hatte eine Aktivität mit einem Thema, <android:theme="@android:style/Theme.Dialog">das zum Anzeigen des Dialogs in meinem AppWidget verwendet wurde, und ich hatte das gleiche Problem

Ich habe diesen Fehler behoben, indem ich den Aktivitätscode wie folgt geändert habe:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_AppCompat_Dialog); //this line i added
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
}

2
Dies war eine einfache Antwort, die für mich ohne die Komplexität und Nichtantwort der akzeptierten Antwort funktionierte.
Cory Trese

8

Für mich war die Lösung ContextThemeWrapper zu verwenden:

private FloatingActionButton getFAB() {
Context context = new android.support.v7.view.ContextThemeWrapper(getContext(), R.style.AppTheme);
FloatingActionButton fab = new FloatingActionButton(context);
return fab;}

von Android - Wie erstelle ich FAB programmgesteuert?


8

Stellen Sie sicher, dass Sie beim Erstellen eines neuen Warnungsdialogs einen Aktivitätskontext verwenden und keinen Anwendungs- oder Basiskontext.


7

Ich hatte auch dieses Problem und was ich getan habe, um es zu beheben, und immer noch das Holo-Thema zu verwenden, war, diese Schritte zu unternehmen:

Zuerst habe ich diesen Import ersetzt:

import android.support.v7.app.AppCompatActivity;

mit diesem:

import android.app.Activity;

dann änderte sich meine Erweiterung von:

public class MyClass extends AppCompatActivity {//...

dazu:

public class MyClass extends Activity {//...

Und musste auch diesen Import ändern:

import android.support.v7.app.AlertDialog;

zu diesem Import:

import android.app.AlertDialog;

und dann können Sie Ihr Theme-Tag im Manifest auf Aktivitätsebene verwenden:

android:theme="@android:style/Theme.Holo.Dialog" />

Und schließlich können Sie (sofern Sie keine anderen Klassen in Ihrem Projekt haben, die v7 appCompat verwenden müssen) Ihr Projekt entweder bereinigen und neu erstellen oder diesen Eintrag in der Gradle-Build-Datei auf App-Ebene löschen:

compile 'com.android.support:appcompat-v7:23.2.1'

Wenn Sie andere Klassen in Ihrem Projekt haben, die v7 appCompat verwenden müssen, bereinigen Sie das Projekt und erstellen Sie es neu.


6

Sie haben dazu gekommen , weil Sie in früheren Versionen sdk bis 21. Material Design in Ihrem Thema Stil anwenden möchten ActionBarActivityerfordert AppThemealso , wenn Sie wollen auch Ihre eigenen Anpassungen über Ihre AppTheme verhindern, nur Sie in Ihrem styles.xml zu ändern (iV auf diese Weise kann für ein App Compat-Thema erben.

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

dafür:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

6
Tat dies. Habe immer noch das Problem. Es steckt also noch mehr dahinter.
Martin

6

Ändern Sie Ihren übergeordneten Themenstil in

 parent="Theme.AppCompat"

Das hat bei mir funktioniert ...


6

Sie haben viele Lösungen für diesen Fehler.

  1. Sie sollten Activity oder FragmentActivity anstelle von ActionbarActivity oder AppCompatActivity verwenden

  2. Wenn Sie ActionbarActivity oder AppCompatActivity verwenden möchten , sollten Sie in styles.xml Theme.Holo.xxxx in Theme.AppCompat.Light ändern (falls erforderlich zu DarkActionbar hinzufügen ).

Wenn Sie keine erweiterten Attribute für die Aktionsleiste oder AppCompat benötigen, müssen Sie die Aktionsleiste oder AppCompat nicht verwenden .


6

Ändern Sie im Android-Manifest einfach das Thema der Aktivität in AppTheme wie folgt: Code-Snippet

<activity
  android:name=".MainActivity"
  android:label="@string/app_name"
  android:theme="@style/AppTheme">
</activity>

<Aktivität android: name = ". MainActivity" android: label = "@ string / app_name" android: theme = "@ style / AppTheme"> </ activity>
Shikha

6

In diesem Fall möchten Sie einen AlertDialog in einem Fragment

            AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
            adb.setTitle("My alert Dialogue \n");
            adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                  //some code

            } });
            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                 dialog.dismiss();

                } });
            adb.show();

6

Nach meinen Erfahrungen war das Problem der Kontext, in dem ich meinen Dialog zeigte. Innerhalb eines Schaltflächenklicks instanziiere ich einen AlertDialog auf folgende Weise:

builder = new AlertDialog.Builder(getApplicationContext());

Der Kontext war jedoch nicht korrekt und verursachte den Fehler. Ich habe es mithilfe des Anwendungskontexts folgendermaßen geändert:

Im Abschnitt deklarieren:

Context mContext;

in der onCreate-Methode

mContext = this;

Und schließlich in dem Code, in dem ich den AlertDialog benötige:

start_stop = (Button) findViewById(R.id.start_stop);
start_stop.setOnClickListener( new View.OnClickListener()
     {
                @Override
                public void onClick(View v)
                {
                    if (!is_running)
                    {
                        builder = new AlertDialog.Builder(mContext);
                        builder.setMessage("MYTEXT")
                                .setCancelable(false)
                                .setPositiveButton("SI", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                    Task_Started = false;
                                    startTask();
                                    }
                                })
                                .setNegativeButton("NO",
                                        new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();
                    }
            }
        }

Das ist die Lösung für mich.


Sie haben Recht, dass Sie einen Anwendungskontext nicht so verwenden sollten, wie Sie ihn ursprünglich hatten. Sie haben stattdessen eine Aktivität als Kontext verwendet. Dies ist jedoch kein Anwendungskontext oder eine Unterklasse davon. Es ist also nicht richtig zu sagen, dass Sie einen Anwendungskontext auf andere Weise verwenden.
Hod

5

Dieser hat für mich funktioniert:

<application
           android:allowBackup="true"
           android:icon="@mipmap/ic_launcher"
           android:label="@string/app_name"
           android:theme="@style/AppTheme" >
           <activity
               android:name=".MainActivity"
               android:label="@string/app_name"
               android:theme="@style/Theme.AppCompat.NoActionBar">

               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />

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

5

Ihre Aktivität erweitert ActionBarActivity, für die das AppCompat.theme angewendet werden muss. Wenn Sie von ActionBarActivity zu Activity oder FragmentActivity wechseln , wird das Problem gelöst.

Wenn Sie keine Aktionsleiste verwenden, gehen Sie wie folgt vor:

android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 

5

Ich hatte das gleiche Problem. Weil ich eine benutzerdefinierte Navigationsschublade erstellt habe. Aber ich vergesse, das Thema in meinem Manifest so zu erwähnen

android:theme="@style/Theme.AppCompat.NoActionBar"

Sobald ich das obige Thema zu meinem Manifest hinzugefügt habe, wurde das Problem behoben.


4

Schnelle Lösung.

Ändern Sie Ihr übergeordnetes Basisthema in styles.xml

Ersetzen von

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

zu

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

hilft mir nicht, die Ausnahme löst immer noch aus
Eugene Gr. Philippov

3

Diese Lösung hat bei mir funktioniert.

Die Designbibliothek hängt von den Support v4- und AppCompat-Supportbibliotheken ab. Verwenden Sie daher keine andere Version für Appcompat und Designbibliothek in Gradle.

verwenden

 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.0.0'

anstatt

 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.1.0'
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.