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 erstellen möchten, können Sie eine Aktivität statt als Dialog-APIs als Dialogfeld anzeigen. Erstellen Sie einfach eine Aktivität und setzen Sie das Thema auf Theme.Holo.Dialog in Das Manifestelement <activity>
:
<activity Android:theme="@Android:style/Theme.Holo.Dialog" >
Wenn ich dies jedoch ausprobierte, erhalte ich die folgende Ausnahme:
Java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity
Ich unterstütze Folgendes, und ich kann nichts größer als 10 für die Minute 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 folgendes für die Tätigkeit:
<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, das ich machen wollte, da ich das Layout bereits fertiggestellt habe.
Kann mir jemand sagen, wie ich dieses Problem umgehen kann?
Der Grund für dieses Problem liegt darin, dass die Aktivität, auf die Sie das Dialogdesign anwenden möchten, die Erweiterung ActionBarActivity
umfasst, wodurch das Design AppCompat
angewendet werden muss.
Update : Das Erweitern von AppCompatActivity
hätte auch dieses Problem
Ändern Sie in diesem Fall die Java-Vererbung von ActionBarActivity
in Activity
, und belassen Sie das Dialogdesign im Manifest so, wie es ist, ein nicht Theme.AppCompat
-Wert
Die allgemeine Regel lautet, wenn Ihr Code ältere Versionen von Android unterstützen soll, sollte er das Thema AppCompat
haben und der Java-Code sollte AppCompatActivity
erweitern. Wenn Sie * eine Aktivität haben, die diese Unterstützung nicht benötigt, z. B. wenn Sie sich nur für die neuesten Versionen und Funktionen von Android interessieren, können Sie ein beliebiges Design darauf anwenden, der Java-Code muss jedoch die alte Activity
erweitern.
HINWEIS: Wenn Sie von AppCompatActivity
(oder einer Unterklasse ActionBarActivity
) zu Activity
wechseln, müssen Sie auch die verschiedenen Aufrufe mit "support" auf den entsprechenden Aufruf ohne "support" umstellen. Rufen Sie also anstelle von getSupportFragmentManager
getFragmentManager
auf.
Alles, was Sie tun müssen, ist, Android:theme="@style/Theme.AppCompat.Light"
zu Ihrem Anwendungstag in der AndroidManifest.xml
-Datei hinzuzufügen.
Antwort von @MarkKeen in den Kommentaren kopiert, da ich das gleiche Problem hatte.
Ich hatte den Fehler oben im Beitrag angegeben und kam nach dem Hinzufügen eines Benachrichtigungsdialogfelds dazu. Ich habe alle relevanten Stilinformationen im Manifest. Mein Problem wurde durch Ändern einer Kontextreferenz im Alert Builder behoben. 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.
min sdk ist 10. ActionBar
ist ab api level 11 verfügbar. Für 10 würden Sie also AppCompat
aus der Support-Bibliothek verwenden, für die Sie Theme.AppCompat
oder dessen Nachkommen benötigen.
Benutzen
Android:theme="@style/Theme.AppCompat" >
Oder wenn Sie keine Aktionsleiste oben haben möchten
Android:theme="@style/Theme.AppCompat.NoActionBar">
Mehr Info @
http://developer.Android.com/guide/topics/ui/actionbar.html
Bearbeiten:
Ich könnte Op post falsch gelesen haben.
Scheint op will einen Dialog mit einem Aktivitätsdesign. Wie bereits von Bobbake4 vorgeschlagen, erweitern Sie Activity
anstelle von ActionBarActivity
.
Schauen Sie sich auch die @ Dialogattribute im Link unten an
Das hat für mich funktioniert, ich habe mich gerade geändert:
final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
zu diesem:
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
Ich hatte dieses Problem, obwohl mein Theme ein AppCompat
Theme war und meine Aktivität eine AppCompatActivity
(oder Activity
, wie in den Antworten der anderen vorgeschlagen). Also habe ich das Projekt gereinigt, neu erstellt und erneut ausgeführt.
( Build -> Projekt bereinigen; Build -> Projekt neu erstellen; Ausführen -> Ausführen )
Es mag dumm erscheinen, aber jetzt funktioniert super !
Ich hoffe es hilft!
Das hat es für mich behoben: Anstatt das Thema im Manifest anzugeben, habe ich es in onCreate
für jede Aktivität definiert, die ActionBarActivity
erweitert:
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.MyAppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity_layout);
...
}
Hier ist MyAppTheme
ein Nachkomme von Theme.AppCompat
und in xml definiert. Beachten Sie, dass das Design vor super.onCreate
und setContentView
festgelegt werden muss.
gehen Sie zu Ihren Stilen und setzen Sie die Eltern
parent="Theme.AppCompat"
anstatt
parent="@Android:style/Theme.Holo.Light"
In meinem Fall habe ich keine values-v21-Datei in meinem Verzeichnis res. 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>
Ändern Sie das Thema der gewünschten Aktivität. Das funktioniert für mich:
<activity
Android:name="HomeActivity"
Android:screenOrientation="landscape"
Android:theme="@style/Theme.AppCompat.Light"
Android:windowSoftInputMode="stateHidden" />
Wenn Sie ActionBarActivity erweitern müssen, müssen Sie es in Ihrer style.xml-Datei ausführen:
<!-- 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 als Android festgelegt haben: Theme.Material.Light anstelle von AppTheme.Base , erhalten Sie eine "IllegalStateException: Sie müssen ein Theme.AppCompat-Theme (oder einen Nachkommen) verwenden Aktivität ”Fehler.
Ich hatte einen solchen Absturz auf Samsung Geräten, obwohl die Aktivität Theme.AppCompat ..__ verwendet hat.
- 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 bestand nur darin, Android:launchMode="singleTask"
zu entfernen.
Ich hatte das gleiche Problem, aber es wurde gelöst, als ich dies auf Manifest setzte: 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>
Mach einfach
new AlertDialog.Builder(this)
Anstatt
new AlertDialog.Builder(getApplicationContext())
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;}
Ändern Sie Ihren übergeordneten Designstil in
parent="Theme.AppCompat"
Das hat für mich funktioniert ...
Ändern Sie in Android Manifest einfach das Aktivitätsthema in AppTheme als Code-Snippet
<activity
Android:name=".MainActivity"
Android:label="@string/app_name"
Android:theme="@style/AppTheme">
</activity>
Ich hatte auch dieses Problem und was ich getan habe, um das Problem zu beheben UND das Holo-Thema immer noch zu verwenden, war die folgenden Schritte:
zuerst habe ich diesen Import ersetzt:
import Android.support.v7.app.AppCompatActivity;
mit diesem:
import Android.app.Activity;
dann meine Erweiterung geändert von:
public class MyClass extends AppCompatActivity {//...
zu diesem:
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 Design-Tag im Manifest auf der Aktivitätsebene verwenden:
Android:theme="@Android:style/Theme.Holo.Dialog" />
und schließlich (sofern Sie nicht über andere Klassen in Ihrem Projekt verfügen, die v7 appCompat verwenden müssen), können Sie 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.
Dies ist der Fall, wenn Sie einen AlertDialog in einem Fragment erstellen möchten
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();
Sie haben viele Lösungen für diesen Fehler.
Sie sollten Activity oder FragmentActivity anstelle von ActionbarActivity oder AppCompatActivity verwenden.
Wenn Sie ActionbarActivity oder AppCompatActivity verwenden möchten, sollten Sie in styles.xml Theme.Holo.xxxx zu Theme.AppCompat.Light wechseln (ggf. hinzufügen zu DarkActionbar )
Wenn Sie keine erweiterten Attribute für die Aktionsleiste oder AppCompat benötigen, müssen Sie Actionbar oder AppCompat nicht verwenden.
Dieser hat für mich gearbeitet:
<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>
Ihre Aktivität erweitert ActionBarActivity was erfordert, dass das AppCompat.theme angewendet wird Wechsel von ActionBarActivity in Activity oder FragmentActivity , es wird das Problem gelöst Problem.
Wenn Sie keine Aktionsleiste verwenden, gilt Folgendes:
Android:theme="@Android:style/Theme.Light.NoTitleBar.Fullscreen"
Sie sind dazu gekommen, weil Sie Material Design in Ihrem Designstil in früheren SDK-Versionen bis 21 anwenden möchten. ActionBarActivity
erfordert AppTheme
so, wenn Sie auch Ihre eigenen Anpassungen an Ihrem AppTheme verhindern möchten, nur Sie haben dies Ändern Sie Ihre Styles.xml (vor Sdk 21), um auf diese Weise ein App Compat-Design zu erben.
<style name="AppTheme" parent="Android:Theme.Holo.Light.DarkActionBar">
dafür:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
In meinen Erfahrungen war das Problem der Kontext, in dem ich meinen Dialog gezeigt habe.
builder = new AlertDialog.Builder(getApplicationContext());
Der Kontext war jedoch nicht korrekt und verursachte den Fehler. Ich habe es mit dem Anwendungskontext folgendermaßen geändert:
Im Deklarationsabschnitt:
Context mContext;
in der onCreate-Methode
mContext = this;
Und schließlich im Code, wo ich den AlertDialog brauche:
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();
}
}
}
Dies ist die Lösung für mich.
Ich hatte eine Aktivität mit dem Theme <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);
}
Schnelle Lösung.
Ändern Sie Ihr übergeordnetes Thema in styles.xml
Ersetzen von
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
zu
<style name="AppTheme" parent="Theme.AppCompat">
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 es erscheint nicht oder es gibt den Kontext zurück bevor ein Thema angewendet wird.
Also habe ich einfach getBaseContexts () durch " this " ersetzt, und jetzt funktioniert es wie erwartet.
Dialog.showAlert(this, title, message,....);
In meinem Fall habe ich eine Ansicht mit ApplicationContext aufgeblasen. Wenn Sie ApplicationContext verwenden, wird das Thema/Stil nicht angewendet. Obwohl es in meinem Stil Theme.Appcompat gab, wurde es nicht angewendet und verursachte diese Ausnahme. Weitere Details: Theme/Style wird nicht angewendet, wenn der Inflater mit ApplicationContext verwendet wird
Für mich funktionierte keine der obigen Antworten, selbst nachdem ich Theme.AppCompat
als Basisthema für die Anwendung hatte. Ich habe com.Android.support:design:24.1.0
verwendet. Also habe ich gerade die Version in 24.1.1
geändert. Nach der Gradle-Synchronisierung funktioniert es wieder und die Ausnahme ist verschwunden. Anscheinend war das Problem bei älteren Versionen der Bibliotheken für das Design.
Setzen Sie dies hier, falls andere Antworten für manche Leute nicht funktionieren.
Ich habe das gleiche Problem bekommen. Weil ich eine eigene Navigationsleiste 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 gelöst.
Diese Lösung hat für mich funktioniert.
Die Design-Bibliothek hängt von den Support-Bibliotheken von Support v4 und AppCompat ab. Verwenden Sie daher keine unterschiedlichen Versionen für appcompat und design-Bibliothek in Gradle.
benutzen
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'
Meine Aktivitäten mit SectionsPagerAdapter und ViewPager & Fragment
public class MyActivity extends AppCompatActivity implements ActionBar.TabListener
...
...
@Override
public void onPostResume(){
super.onPostResume();
try {
getSupportActionBar().setDisplayShowTitleEnabled(false);
}catch (NullPointerException ignored){
}
}
Das zwang mich wirklich, meine eigene Antwort zu posten. Da ich Theme.AppCompat.Light.NoActionBar verwende und auch alle AlertDialog-Programme mit Support-Import-Importen ersetzte und immer noch auf Probleme unter Version 21 (Lollipop) stieß, fiel mir nichts ein nach 2 Tagen dachte ich schließlich über andere Bibliotheken nach, die AppTheme für ihre AndroidManifest.xml spezifizierten, ja, es gab eine -> "PayTM pgsdk library" . Folgende Änderungen behielten das Problem.
verwenden von Tools: Ersetzen Sie die Methode in AndroidManifest meines Projekts (App).
<uses-permission Android:name="Android.permission.INTERNET" />
<application
Android:name=".XYZ"
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher_v2"
Android:label="@string/app_name"
Android:largeHeap="true"
Android:roundIcon="@mipmap/ic_launcher_v2_round"
Android:supportsRtl="true"
Android:theme="@style/XYZAppTheme"
tools:replace="Android:icon,Android:theme">
<activity
Android:name=".xyz.SplashActivity"
Android:launchMode="singleTask"
Android:screenOrientation="portrait">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Für mich wurde das Problem gelöst, indem die Vererbung von AppCompatActivity in Activity in meiner customDialog-Klasse geändert wurde. Es sind keine Änderungen in Manifest für Theme.Dialog erforderlich.
Wenn Sie beim Aufblasen des Layouts getApplicationContext () als Parameter verwenden, können Sie stattdessen getBaseContext () verwenden. z.B.
View.inflate(getBaseContext(),
getLayoutId() == 0 ? R.layout.page_default : getLayoutId(),
null);
Wenn Sie Kotlin verwenden, wurde mein Problem erst gelöst, nachdem ich den Builder-Parameter von "applicationContext" in "this" geändert habe.
Das funktioniert nicht
val dialogDelete = AlertDialog.Builder(applicationContext)
.setTitle("Confirmation")
.setMessage("Delete this photo?")
.setNegativeButton(Android.R.string.no){ it, which ->
it.dismiss()
}
dialogDelete.show()
Folgender Code funktioniert
val dialogDelete = AlertDialog.Builder(this)
.setTitle("Confirmation")
.setMessage("Delete this photo?")
.setNegativeButton(Android.R.string.no){ it, which ->
it.dismiss()
}
dialogDelete.show()
In Android Studio: Fügen Sie der Gradle-Datei eine Unterstützungsbibliothek hinzu und synchronisieren Sie . Bearbeiten Sie build.gradle (Modul: app), um die folgenden Abhängigkeiten zu haben:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.Android.support:design:23.1.1'
compile 'com.Android.support:support-v4:23.1.1'
}
Meine Version der Unterstützungsbibliothek ist 23.1.1; Verwenden Sie ggf. Ihre Version der Support-Bibliothek.
In meinem Fall habe ich einen Stil namens "FullScreenTheme" verwendet, und obwohl er richtig definiert zu sein schien (er stammte von Theme.AppCompat
ab), funktionierte er nicht.
Endlich wurde mir klar, dass ich eine AAR-Bibliothek verwende, die intern auch einen Stil namens "FullScreenTheme" definiert hat und es war nicht Nachkomme von Theme.AppCompat
. Das Aufeinandertreffen der Namen verursachte das Problem.
Beheben Sie das Problem, indem Sie meinen eigenen Stilnamen umbenennen, sodass Android jetzt den richtigen Stil verwendet.
ANMERKUNG: Ich hatte dies als Antwort gedacht, aber weitere Tests zeigen, dass es immer noch fehlschlägt, wenn Maven von der Befehlszeile aus erstellt wurde. Ich musste es also bearbeiten, um ein Problem zu sein! :-(
In meinem Fall, als ich diesen Fehler erhielt, verwendete ich bereits ein AppCompat-Design, und der Fehler ergab keinen Sinn.
Ich war gerade dabei, meinen Android-Build zu mavenisieren. Ich hatte bereits Abhängigkeiten von der apklib- und jar-Version von app compat, also:
<!-- See https://github.com/mosabua/maven-Android-sdk-deployer -->
<dependency>
<groupId>Android.support</groupId>
<artifactId>compatibility-v7-appcompat</artifactId>
<version>${compatibility.version}</version>
<type>apklib</type>
</dependency>
<dependency>
<groupId>Android.support</groupId>
<artifactId>compatibility-v7-appcompat</artifactId>
<type>jar</type>
</dependency>
<dependency>
<groupId>Android.support</groupId>
<artifactId>compatibility-v7</artifactId>
<type>jar</type>
</dependency>
<dependency>
<groupId>Android.support</groupId>
<artifactId>compatibility-v4</artifactId>
</dependency>
Nun, wenn ich das Maven-Projekt importiere und von IntelliJ aus baue und ausgeführt werde, ist das in Ordnung.
Wenn ich aber mit maven von der Kommandozeile aus baue und implementiere, dann bekomme ich immer noch diese Ausnahme.
Fügen Sie in Ihrem app/build.gradle
diese Abhängigkeit hinzu:
implementation "com.google.Android.material:material:1.1.0-alpha03"
Aktualisieren Sie das styles.xml
AppTheme-Elternteil:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"/>