Sie müssen für diese Aktivität ein Theme.AppCompat-Thema (oder einen Nachkommen) verwenden. Der Wechsel zu Theme.AppCompat verursacht einen anderen Fehler

74

Ich verwende appcompat v22.1.0 in meiner App und verwende die Symbolleiste. Alles war in Ordnung, wenn ich benutze Theme.AppCompat.Light.NoActionBar. Wenn ich mit der Implementierung beginne AlertDialog, wird folgender Fehler ausgegeben:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
        at android.support.v7.app.AppCompatDelegateImplBase.onCreate(AppCompatDelegateImplBase.java:113)
        at android.support.v7.app.AppCompatDelegateImplV7.onCreate(AppCompatDelegateImplV7.java:146)
        at android.support.v7.app.AppCompatDialog.<init>(AppCompatDialog.java:47)
        at android.support.v7.app.AlertDialog.<init>(AlertDialog.java:92)
        at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:882)
        at com.ramabmtr.map.findingmoo.MainActivity.onOptionsItemSelected(MainActivity.java:216)
        at android.app.Activity.onMenuItemSelected(Activity.java:2572)
        at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:353)
        at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:144)
        at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:99)
        at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:99)
        at android.support.v7.internal.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:74)
        at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:164)
        at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:740)
        at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:802)
        at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
        at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:949)
        at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:939)
        at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:598)
        at android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:139)
        at android.view.View.performClick(View.java:4084)
        at android.view.View$PerformClick.run(View.java:16989)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4812)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559)
        at dalvik.system.NativeStart.main(Native Method)

Aufgrund dieses Fehlers ändere ich mein Thema in Theme.AppCompatund setze Folgendes:

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

zu meinem Thema. Aber es erzeugt den gleichen Fehler.

Style.xml (alt)

<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>
</resources>

Style.xml (neu)

<resources>
<style name="AppTheme" parent="Theme.AppCompat">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>
</resources>

Weiß jemand, wie man es repariert?

MainActivity.java

package com.ramabmtr.map.findingmoo;

import android.content.DialogInterface;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private TextView toolbarTitle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/panpizza.ttf");
    toolbarTitle = (TextView) findViewById(R.id.toolbar_title);
    toolbarTitle.setTypeface(myTypeface);

    AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
    builder.setTitle(R.string.filter_title);
    builder.setMessage("test");
    builder.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
            dialog.dismiss();
        }
    });
    builder.setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
            dialog.dismiss();
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}
}
Rama Bramantara
quelle
When I start implement AlertDialogWo ist der Code für den Alarmdialog?
Rod_Algonquin
33
Verwenden Sie den Anwendungskontext NICHT zum Aufblasen von Ansichten und zum Erstellen von Dialogen. new AlertDialog.Builder(this)wäre auch in Ordnung, weil es alertDialogThemeAttribut liest .
Eugen Pechanec
@ Eugen Pechanec hat mir den Tag gerettet!
Biswas Khayargoli
Besuchen Sie diesen Link hier, um das Problem zu lösen: stackoverflow.com/a/45940291/4832664
JA

Antworten:

86

Grundsätzlich verwendet Ihre Aktivität die Symbolleiste (die die Aktionsleiste ersetzt), sodass Sie für die Aktivität, die keine Aktionsleiste enthält, einen Stil verwenden müssen Theme.AppCompat.Light.NoActionBar. Wenn Sie einen eigenen Dialogstil haben, müssen Sie das richtige AppCompat-Design erben.

<style name="myDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    ...
</style>

AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog));
inmyth
quelle
1
Aber wenn ich benutze AlertDialog, gibt es mir Fehlerjava.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
Rama Bramantara
3
Theme.AppCompat.Dialogist für thematische Aktivitäten, Theme.AppCompat.Dialog.Alertist für thematische Alarmdialoge. Ersteres führt zu einem sichtbaren Doppelfensterrahmen für Warndialoge auf Plattformen vor Lollipop.
Eugen Pechanec
in meinem Fall ersetze ich die Eltern zu<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
shareef
19
Übergeben Sie das einfach MainActivity.thisan Builder, es wird gut funktionieren.
Raptor
Dies funktioniert nicht mit Fragment. Fehler:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
Konstantin Konopko
110

Mein Problem wurde durch Verwendung von MainActivity.this (oder YourActivityName.this) behoben.

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);

Stellen Sie sicher, dass Sie bereits Theme.AppCompat und AppCompatActivity erweitern.

Mariozawa
quelle
2
Dies ist die Antwort, die für mich funktioniert hat. Großartig, danke!
Gareth
7
So viele komplizierte Antworten auf diese Frage und dies ist die beste. Sehr einfach, keine XML-Dateien müssen geändert werden. Man muss davon ausgehen, dass die Person mit dieser Frage bereits funktionierende XML-Dateien hat. Dies erweitert nur die Verwendung dieses vorhandenen Codes.
Dale
3
Einfach zu benutzen getAplicationContext()wird nicht funktionieren. Sie müssen das oben angegebene Format verwenden.
mjr
@mariozawa Deine Antwort hat bei mir funktioniert. Vielen Dank. +1!
IRGeekSauce
In Kotlin verwendet das Erstellen des Dialogs diese @ MainActivity, wie folgt: val alertDialog = AlertDialog.Builder (this @ MainActivity) .create ()
Joe Pinsonault
54

In meinem Fall war dieser Absturz verursacht , weil ich vorging View.getContext().getApplicationContext()als Contextzu dem Builder. Dies wurde behoben, indem getActivity()stattdessen verwendet wurde.

Binoy Babu
quelle
23

Sah die gleiche Ausnahme mit Activityund Theme.LightThema. Mein Problem war ein falscher Import, ich habe den Support verwendet. import android.support.v7.app.AlertDialog;anstatt import android.app.AlertDialog;

Rogelio
quelle
Bingo Bango Bongo! Das hat es für mich getan.
James
Dies war die Lösung, die ich brauchte. Vielen Dank!!
Cindy
12

Wenn Sie diesen Fehler beim Erstellen eines Dialogfelds haben (nur in meinem Fall) , sollten Sie Folgendes verwenden :

AlertDialog.Builder dialog = new AlertDialog.Builder(context, R.style.Theme_AppCompat_Light);

anstatt:

AlertDialog.Builder dialog = new AlertDialog.Builder(context);

Das hat mir perfekt geklappt!

Karoly
quelle
1
Dies hat bei mir funktioniert, aber ich habe zu geändert R.style.Theme_AppCompat_Light, Theme_AppCompat_Light_Dialogdamit der Dialog nicht den Vollbildmodus verwendet.
Alan Kinnaman
5

Das Problem liegt an dem Kontext, den Sie zum Erstellen des Warnungsdialogs übergeben. Verwenden Sie getApplicationContext () nicht. Versuchen Sie, Ihren Aktivitätskontext zu verwenden AlertDialog.Builder builder = new AlertDialog.Builder(MainActiviy.this);

Rajesh.k
quelle
5

Diese Arbeit für mich ... nach dem Lesen mehrere Antworten war ...

Ändern Sie meinen Import wie folgt:

import android.app.AlertDialog;

anstatt

import android.support.v7.app.AlertDialog; 

Dies gibt einen Fehler. Fenster kann nicht hinzugefügt werden. Token Null ist nicht für eine Anwendung. Daher ändere ich den Kontext des Builders von

AlertDialog.Builder builder = new 

AlertDialog.Builder (getAplicationContext ()); zu

AlertDialog.Builder builder = new AlertDialog.Builder(*MainActivity.this*);
Carolina
quelle
1
Bitte erklären Sie etwas mehr
Muhammad Muazzam
Ich hatte den gleichen Fehler wie er. Meine App stürzte nur ab, wenn ein AlertDialog angezeigt wurde. Ich habe fälschlicherweise eine AppCompat-Version importiert
mjekov
4

Hinzufügen von Android: theme = "@ style / Theme.AppCompat" wie folgt im Manifest

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

Problem gelöst

GoGam
quelle
1

Wenn Sie eine Support-Bibliothek verwenden, wird Ihre Aktivität erweitert AppCompactActivity. Wenn Sie android studioeine Aktivität erstellen, ist dies die Standardeinstellung. In diesem Fall übergeben Sie den Kontext an den Builder, ActivityName.thisoder thiswenn Sie ihn einfach übergeben onCreate, getApplicationContext()funktioniert die Übergabe nicht.

Das ist mein Stil appcompact

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textSize">18sp</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

Und alles funktioniert gut, wenn ich thisoder ActivityName.thiswie oben erwähnt (hier ist ActivityName der Name Ihrer aktuellen Aktivität, dh MainActivity.this).

Wenn Sie in Fragment verwenden, sollten Sie getActivity()stattdessen als Kontext an Builder übergeben getContext().

Inzimam Tariq IT
quelle
appcompact style :)
AlexS
0

Sie müssen stattdessen den Kontext Ihrer Aktivität übergeben, um Ihren Kontext zu übergeben. Versuchen Sie es mit "this" statt "context". Diese Arbeit für mich

oskarko
quelle
0

In meinem Fall musste ich überprüfen und sicherstellen, dass alle styles.xml-Dateien verwendet werden Theme.AppCompat. Die Standarddatei styles.xml hatte dieses Thema, aber es gab auch Stile (v21) .xml, Stile (v11) .xml und Stile (sw600dp) .xml, die automatisch generiert wurden. Die einfache Lösung wäre, den angepassten Standard-AppTheme-Stil zu kopieren und in diese Ordner einzufügen.

Alles Gute!

iOSAndroidWindowsMobileAppsDev
quelle
0

Bitte seien Sie vorsichtig mit solchen Problemen, ich habe lange, lange Stunden auf solche Fehler gewartet. es passiert nur auf Android 4.4.2 Version, obwohl ich das Appcompat-Thema überall verwende, versucht habe, mit allen Stilen zu spielen und viele andere Threads und Antworten zu verwenden.

Das Problem wurde durch diese Zeile verursacht:

 <style name="LooperLabTheme"
        parent.theme="@style/Theme.AppCompat.Light.NoActionBar"
        theme="@style/Theme.AppCompat.Light.NoActionBar">
<style/>

Bitte beachten Sie das "parent.theme". Ich habe es aus einer Antwort in den ersten Tagen nach dem Start des Projekts kopiert, an dem ich gerade arbeite. Es sollte "parent" ohne das Thema sein.

 <style name="LooperLabTheme"
            parent="@style/Theme.AppCompat.Light.NoActionBar"
            theme="@style/Theme.AppCompat.Light.NoActionBar">
    <style/>

Ich möchte nur anderen helfen, die von Thread zu Thread laufen, um die Lösung für sein sehr spezifisches Problem herauszufinden. Es könnte das gleiche sein wie meines. Sparen Sie Zeit.

Bahadin Khalilieh
quelle
0
getSupportActionBar().getThemedContext()

AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    builder = new AlertDialog.Builder(getSupportActionBar().getThemedContext(), android.R.style.Theme_Material_Dialog_Alert);
} else {
    builder = new AlertDialog.Builder(getSupportActionBar().getThemedContext());
}
builder.setTitle("Alert Dialog")
       .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

            }
        })
       .setIcon(android.R.drawable.ic_dialog_alert)
       .show();
Miragessee
quelle
0

In Kotlin hat das bei mir funktioniert:

val dialog = AlertDialog.Builder(this)
Herttzon
quelle