1220 Stimmen

Du musst ein Theme.AppCompat-Thema (oder Abkömmling) mit dieser Aktivität verwenden

Android Studio 0.4.5

Android-Dokumentation zur Erstellung 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 ihr Theme auf Theme.Holo.Dialog im the Manifestelement:

Allerdings erhalte ich bei meinem Versuch die folgende Ausnahme:

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

Ich unterstütze das Folgende, und ich kann nichts Größeres als 10 für das Minimum verwenden:

minSdkVersion 10
targetSdkVersion 19

In meinen Styles habe ich das Folgende:

</code></pre>

<p>Und in meinem Manifest habe ich dies für die Aktivität:</p>

<pre><code> <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>
</code></pre>

<p>Die Erstellung des Dialogfelds auf diese Weise war etwas, was ich gerne machen wollte, da das Layout bereits abgeschlossen ist.</p>

<p>Kann mir jemand sagen, wie ich dieses Problem umgehen kann?</p></x-turndown>

11voto

Vitaliy A Punkte 3411

In meinem Fall trat dieses Problem auf, als ich versuchte, einen Dialog anzuzeigen. Das Problem lag am Kontext, den ich getBaseContext() verwendet habe, der theoretisch den Aktivitätskontext zurückgeben sollte, sich aber herausstellte, dass dies nicht der Fall ist oder er den Kontext vor der Anwendung eines Themas zurückgibt.

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

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

10voto

Elyas Nategh Punkte 502

Ich hatte eine Aktivität mit dem Thema verwendet zum Anzeigen eines Dialogs in meinem AppWidget und hatte das gleiche Problem.

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_AppCompat_Dialog); // Diese Zeile habe ich hinzugefügt
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
}

10voto

danigonlinea Punkte 1093

Sie sind hierher gekommen, weil Sie Material Design in Ihrem Design-Stil in früheren SDK-Versionen bis 21 anwenden möchten. ActionBarActivity erfordert AppTheme, also wenn Sie auch Ihre eigene Anpassung an Ihrem AppTheme verhindern möchten, müssen Sie nur in Ihrer styles.xml (vor SDK 21) ändern, damit auf diese Weise ein AppCompat-Design übernommen werden kann.

</code></pre>

<p>für folgendes:</p>

<pre><code><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</code></pre></x-turndown>

9voto

Shivam Dawar Punkte 403

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

9voto

Martin Zeitler Punkte 1

Wenn Sie hierher gekommen sind, weil die AndroidX SplashScreen-Bibliothek Sie hierher gebracht hat ...

Dies liegt daran, dass auch Theme.SplashScreen keine R.styleable.AppCompatTheme_windowActionBar hat:

if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {
    a.recycle();
    throw new IllegalStateException(
            "Sie müssen ein Theme.AppCompat-Thema (oder Nachfolger) für diese Aktivität verwenden.");
}

Dies erfordert das Umschalten des Themas auf das postSplashScreenTheme, bevor super() aufgerufen wird:

@Override
protected void onCreate(Bundle savedInstanceState) {

    /* Beim Wechsel des Themas in den Dunkelmodus. */
    if (savedInstanceState != null) {
        this.setTheme(R.style.AppTheme);
    }
    super.onCreate(savedInstanceState);

    /* Beim Starten der Aktivität. */
    if (savedInstanceState == null) {
        SplashScreen.installSplashScreen(this);
    }
}

Dann wird das Theme.SplashScreen aus AndroidManifest.xml nicht interferieren.


Auch recht relevant: Bei Verwendung von Theme.MaterialComponents gibt es ein Brückenthema, das als Ersatz für Theme.AppCompat fungiert: Theme.MaterialComponents.DayNight.NoActionBar.Bridge.

Dieses Bridge-Thema funktioniert, obwohl Theme.MaterialComponents nicht von Theme.AppCompat erbt:

    <style name="AppTheme.SplashScreen" parent="Theme.SplashScreen" />    
</resources>
</code></pre></x-turndown>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X