Ich fragte mich, ob mir jemand helfen könnte. Ich versuche, einen benutzerdefinierten AlertDialog zu erstellen. Zu diesem Zweck habe ich die folgende Codezeile in styles.xml hinzugefügt
<resources>
<style name="CustomAlertDialog" parent="android:Theme.Dialog.Alert">
<item name="android:windowBackground">@drawable/color_panel_background</item>
</style>
</resources>
- color_panel_background.9.png befindet sich im Zeichenordner. Dies ist auch im Android SDK res-Ordner verfügbar.
Das Folgende ist die Hauptaktivität.
package com.customdialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
public class CustomDialog extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTheme(R.style.CustomAlertDialog);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("HELLO!");
builder .setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//dialog.cancel();
}
});
AlertDialog alertdialog = builder.create();
alertdialog.show();
}
}
Um das Thema auf einen AlertDialog anzuwenden, musste ich das Thema auf den aktuellen Kontext einstellen.
Ich kann jedoch nicht scheinen, dass die App angepassten AlertDialog anzeigt. Kann mir jemand dabei helfen?
Antworten:
In Dialog.java (Android src) wird ein ContextThemeWrapper verwendet. Sie können also die Idee kopieren und Folgendes tun:
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));
Und dann stylen Sie es wie Sie wollen:
quelle
@android:style/Theme.Dialog
öffentlich? Kann es stattdessen verwendet werden?Theme.AppCompat.Light.Dialog.Alert
Stil als übergeordnetes Element Ihres benutzerdefinierten Stils zu verwenden. Aber wenn Sie dies tun, stellen Sie sicher, dass Sie importierenimport android.support.v7.app.AlertDialog;
und nichtimport android.app.AlertDialog
Ich hatte dieses
AlertDialog
themenbezogene Problem mit SDK 1.6, wie hier beschrieben: http://markmail.org/message/mj5ut56irkrkc4nrIch habe das Problem folgendermaßen gelöst:
Hoffe das hilft.
quelle
Ich habe in meinem Blog einen Artikel darüber geschrieben, wie das Layout eines AlertDialogs mit Dateien im XML-Stil konfiguriert wird. Das Hauptproblem besteht darin, dass Sie unterschiedliche Stildefinitionen für unterschiedliche Layoutparameter benötigen. Hier ist ein Boilerplate, das auf dem AlertDialog-Stil von Holo Light Platform Version 19 basiert, für eine Stildatei, die eine Reihe von Standardlayoutaspekten wie Textgrößen und Hintergrundfarben abdecken soll.
quelle
quelle
Ich hatte damit zu kämpfen - Sie können den Hintergrund des Dialogfelds mit
android:alertDialogStyle="@style/AlertDialog"
Ihrem Thema gestalten, aber es ignoriert alle Texteinstellungen, die Sie haben. Wie @rflexor oben sagte, kann dies nicht mit dem SDK vor Honeycomb durchgeführt werden (gut, Sie könnten es verwendenReflection
).Kurz gesagt, meine Lösung bestand darin, den Hintergrund des Dialogfelds wie oben beschrieben zu gestalten und dann eine benutzerdefinierte Titel- und Inhaltsansicht festzulegen (unter Verwendung von Layouts, die mit denen im SDK identisch sind).
Mein Wrapper:
alert_dialog_title.xml (aus dem SDK entnommen)
alert_dialog_message.xml
Verwenden Sie dann einfach
CustomAlertDialogBuilder
anstelle vonAlertDialog.Builder
, um Ihre Dialoge zu erstellen, und rufen Sie einfachsetTitle
undsetMessage
wie gewohnt an.quelle
Sie können ein Thema direkt zuweisen, wenn Sie den Builder starten:
Passen Sie dann Ihr Thema in Ihrem an
values/styles.xml
quelle
Theme.AppCompat.Light.Dialog.Alert
Für benutzerdefinierten Dialog:
Rufen Sie einfach
super(context,R.style.<dialog style>)
stattsuper(context)
im Dialogkonstruktor aufFür AlertDialog:
Erstellen Sie einfach alertDialog mit diesem Konstruktor:
quelle
Ich denke, das geht nicht. Zumindest nicht mit dem Builder. Ich arbeite mit 1.6 und die Implementierung in Builder.create () lautet:
Dies ruft den "nicht themenbezogenen" Konstruktor von AlertDialog auf, der folgendermaßen aussieht:
In AlertDialog gibt es einen zweiten Konstruktor zum Ändern von Themen:
dass der Builder einfach nicht anruft.
Wenn der Dialog sowieso ziemlich allgemein ist, würde ich versuchen, eine Unterklasse von AlertDialog zu schreiben, den zweiten Konstruktor aufzurufen und diese Klasse anstelle des Builder-Mechanismus zu verwenden.
quelle
Ein besserer Weg, dies zu tun, verwenden Sie einen benutzerdefinierten Dialog und passen Sie ihn an Ihre Bedürfnisse an. Hier ist ein Beispiel für einen benutzerdefinierten Dialog .....
}}
Hier ist das XML-Layout
quelle
Jeder, der dies innerhalb eines Fragments versucht (unter Verwendung der Unterstützungsbibliothek, dh vor API 11), sollte Folgendes tun:
@Rflexor gab mir den Anstoß, AlertDialog zu erweitern und den Konstruktor zu entlarven, danke
quelle
AlertDialog.Builder(Context, int)
funktioniert nur mit API 11 und höher. Ihr Code stürzt bei früheren Android-Versionen ab.Die Lösung von Arve Waltin sieht gut aus, obwohl ich sie noch nicht getestet habe. Es gibt eine andere Lösung , falls Sie Schwierigkeiten haben , dass immer auf der Arbeit .... erweitern
AlertDialog.Builder
und alle Methoden außer Kraft setzen (zB.setText
,setTitle
,setView
Usw.) nicht mit der tatsächlichen Dialog Text / Titel / Ansicht verwenden , sondern eine neue Ansicht zu schaffen , in Die Ansicht des Dialogs erledigt alles dort. Dann können Sie alles nach Belieben stylen.Zur Verdeutlichung wird für die übergeordnete Klasse die Ansicht festgelegt und nichts anderes.
In Bezug auf Ihre benutzerdefinierte erweiterte Klasse wird alles in dieser Ansicht ausgeführt.
quelle
Ich bin nicht sicher, wie die Lösung von Arve in einem benutzerdefinierten Dialog mit dem Builder funktionieren würde, in dem die Ansicht über einen LayoutInflator aufgeblasen wird.
Die Lösung sollte darin bestehen, den ContextThemeWrapper durch Folgendes in den Inflator einzuführen
cloneInContext()
:quelle
Dies kann einfach mit setView () des Builders erfolgen. Sie können eine beliebige Ansicht Ihrer Wahl erstellen und in den Builder einspeisen. Das funktioniert gut. Ich verwende eine benutzerdefinierte Textansicht, die vom Dialog-Builder gerendert wird. Ich setze die Nachricht nicht und dieser Bereich wird verwendet, um meine benutzerdefinierte Textansicht zu rendern.
quelle
quelle