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.AppCompat
und 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();
}
}
android
android-appcompat
Rama Bramantara
quelle
quelle
When I start implement AlertDialog
Wo ist der Code für den Alarmdialog?new AlertDialog.Builder(this)
wäre auch in Ordnung, weil esalertDialogTheme
Attribut liest .Antworten:
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));
quelle
AlertDialog
, gibt es mir Fehlerjava.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
Theme.AppCompat.Dialog
ist für thematische Aktivitäten,Theme.AppCompat.Dialog.Alert
ist für thematische Alarmdialoge. Ersteres führt zu einem sichtbaren Doppelfensterrahmen für Warndialoge auf Plattformen vor Lollipop.<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
MainActivity.this
an Builder, es wird gut funktionieren.android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
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.
quelle
getAplicationContext()
wird nicht funktionieren. Sie müssen das oben angegebene Format verwenden.In meinem Fall war dieser Absturz verursacht , weil ich vorging
View.getContext().getApplicationContext()
alsContext
zu demBuilder
. Dies wurde behoben, indemgetActivity()
stattdessen verwendet wurde.quelle
Sah die gleiche Ausnahme mit
Activity
undTheme.Light
Thema. Mein Problem war ein falscher Import, ich habe den Support verwendet.import android.support.v7.app.AlertDialog;
anstattimport android.app.AlertDialog;
quelle
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!
quelle
R.style.Theme_AppCompat_Light
,Theme_AppCompat_Light_Dialog
damit der Dialog nicht den Vollbildmodus verwendet.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);
quelle
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*);
quelle
Hinzufügen von Android: theme = "@ style / Theme.AppCompat" wie folgt im Manifest
<activity android:theme="@style/Theme.AppCompat" android:name=".MainActivity"
Problem gelöst
quelle
Wenn Sie eine Support-Bibliothek verwenden, wird Ihre Aktivität erweitert
AppCompactActivity
. Wenn Sieandroid studio
eine Aktivität erstellen, ist dies die Standardeinstellung. In diesem Fall übergeben Sie den Kontext an den Builder,ActivityName.this
oderthis
wenn Sie ihn einfach übergebenonCreate
,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
this
oderActivityName.this
wie oben erwähnt (hier ist ActivityName der Name Ihrer aktuellen Aktivität, dhMainActivity.this
).Wenn Sie in Fragment verwenden, sollten Sie
getActivity()
stattdessen als Kontext an Builder übergebengetContext()
.quelle
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
quelle
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!
quelle
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.
quelle
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();
quelle
In Kotlin hat das bei mir funktioniert:
val dialog = AlertDialog.Builder(this)
quelle