Google empfiehlt, dass wir DialogFragment
anstelle einer einfachen Dialog
Verwendung verwenden Fragments API
, aber es ist absurd, eine isolierte DialogFragment
für eine einfache Ja-Nein-Bestätigungsmeldung zu verwenden. Was ist in diesem Fall die beste Vorgehensweise?
244
Dialog
oderAlertDialog.Builder::create()::show()
erstellt ein Dialogfeld, das beim Drehen des Bildschirms verschwindet.Antworten:
Ja, verwenden Sie
DialogFragment
und in könnenonCreateDialog
Sie trotzdem einfach einen AlertDialog-Builder verwenden, um eine einfacheAlertDialog
Bestätigungsschaltfläche mit Ja / Nein zu erstellen . Überhaupt nicht sehr viel Code.In Bezug auf die Behandlung von Ereignissen in Ihrem Fragment gibt es verschiedene Möglichkeiten, dies zu tun. Ich definiere jedoch einfach eine Nachricht
Handler
in meinemFragment
, übergebe sieDialogFragment
über den Konstruktor an und übergebe dann Nachrichten an den Handler meines Fragments zurück , um sie für die verschiedenen Klickereignisse zu verwenden. Wieder verschiedene Möglichkeiten, aber das Folgende funktioniert für mich.Halten Sie im Dialogfeld eine Nachricht und instanziieren Sie sie im Konstruktor:
Implementieren Sie das
onClickListener
in Ihrem Dialog und rufen Sie den Handler entsprechend auf:Bearbeiten
Und wie
Message
es paketierbar ist, können Sie es speichernonSaveInstanceState
und wiederherstellenDann in
onCreate
quelle
target
das null ist, wenn Sie es aus einem Bundle laden. Wenn das Ziel einer Nachricht null ist und Sie verwendensendToTarget
, erhalten Sie eine NullPointerException - nicht weil die Nachricht null ist, sondern weil ihr Ziel ist.Sie können generische DialogFragment-Unterklassen wie YesNoDialog und OkDialog erstellen und Titel und Nachricht übergeben, wenn Sie in Ihrer App häufig Dialoge verwenden.
Rufen Sie es dann wie folgt auf:
Und behandeln Sie das Ergebnis in
onActivityResult
.quelle
YES_NO_CALL
,getFragmentManager()
undonActivityResult
?YES_NO_CALL
ist ein benutzerdefiniertes int, das der Anforderungscode ist.getFragmentManager()
Ruft den Fragmentmanager für die Aktivität ab undonActivityResult()
ist eine Rückrufmethode für den Fragmentlebenszyklus.Verwenden Sie DialogFragment über AlertDialog:
Seit der Einführung von API Level 13 :
Die showDialog- Methode von Activity ist veraltet . Das Aufrufen eines Dialogfelds an einer anderen Stelle im Code ist nicht ratsam, da Sie das Dialogfeld selbst verwalten müssen (z. B. Änderung der Ausrichtung).
Differenz DialogFragment - AlertDialog
Sind sie so unterschiedlich? Aus der Android-Referenz zu DialogFragment :
Weitere Hinweise
quelle
Ich würde empfehlen, zu verwenden
DialogFragment
.Sicher, das Erstellen eines "Ja / Nein" -Dialogs damit ist ziemlich komplex, wenn man bedenkt, dass es eine ziemlich einfache Aufgabe sein sollte, aber ein ähnliches Dialogfeld mit
Dialog
ist auch überraschend kompliziert.(Der Aktivitätslebenszyklus macht es kompliziert - Sie müssen
Activity
den Lebenszyklus des Dialogfelds verwalten lassen - und es gibt keine Möglichkeit, benutzerdefinierte Parameter, z. B. die benutzerdefinierte Nachricht, an zu übergebenActivity.showDialog
API-Ebenen unter 8 zu übergeben.)Das Schöne ist, dass Sie normalerweise
DialogFragment
ganz einfach Ihre eigene Abstraktion darauf aufbauen können.quelle
String
Parameter akzeptiert. Wenn der Benutzer beispielsweise auf "Ja" klickt, ruft der Dialog die Methode der Aktivität mit dem Parameter "Zustimmen" auf. Diese Parameter werden beim Anzeigen des Dialogfelds angegeben, z. B. AskDialog.ask ("Stimmen Sie diesen Begriffen zu?", "Zustimmen", "Nicht zustimmen").FragmentManager
's verwendenfindFragmentByTag
. Aber ja, es erfordert ein gutes Stück Code.Fragment
this
und IhrActivity
extends
Ihr habenInterface
. Wenn Sie jedoch auf Threading achten, können Sie Schnittstellenaufrufe abbrechen, wenn Sie diese nicht unbedingt möchten, wenn Ihre Parallelität nicht überprüft wird. Sie sind sich nicht sicher, was dies mit Spaghetti mit Gedächtnis und zirkulärer Abhängigkeit zu tun hat. Die andere Option istMessage
/,Handler
aber Sie haben möglicherweise immer noch Probleme mit der Parallelität.Generisches AlertDialogFragment mit Builder-Muster
In meinem Projekt habe ich bereits
AlertDialog.Builder
schon viel , bevor ich herausfand, dass es problematisch ist. Ich wollte jedoch nirgendwo in meiner App so viel Code ändern. Außerdem bin ich ein Fan davon,OnClickListeners
als anonyme Klassen dort zu bestehen, wo sie benötigt werden (dh wenn ich sie benutze)setPositiveButton()
.setNegativeButton()
etc.) anstelle von Tausenden von Callback - Methoden zu implementieren zwischen einem Dialogfragment und dem Halter Fragment zu kommunizieren, was kann, in Meiner Meinung nach führt dies zu sehr verwirrendem und komplexem Code. Insbesondere, wenn Sie mehrere verschiedene Dialoge in einem Fragment haben und dann in den Rückrufimplementierungen unterscheiden müssen, welche Dialoge gerade angezeigt werden.Daher habe ich verschiedene Ansätze kombiniert, um eine generische
AlertDialogFragment
Hilfsklasse zu erstellen , die genau wie folgt verwendet werden kannAlertDialog
:LÖSUNG
( BITTE BEACHTEN SIE, dass ich in meinem Code Java 8-Lambda-Ausdrücke verwende. Wenn Sie noch keine Lambda-Ausdrücke verwenden, müssen Sie möglicherweise Teile des Codes ändern .)
VERWENDUNG
Ich poste dies hier nicht nur, um meine Lösung zu teilen, sondern auch, weil ich Sie nach Ihrer Meinung fragen wollte: Ist dieser Ansatz in gewissem Maße legitim oder problematisch?
quelle
Darf ich eine kleine Vereinfachung der Antwort von @ ashishduh vorschlagen:
Der Benutzer (der Klasse) muss nicht mehr mit den Interna der Komponente vertraut sein, und die Verwendung ist sehr einfach:
PS In meinem Fall brauchte ich einen einfachen Warndialog, also habe ich das erstellt. Sie können den Ansatz auf ein Ja / Nein oder einen anderen Typ anwenden, den Sie benötigen.
quelle
Verwenden Sie Dialog für einfache Ja- oder Nein-Dialoge.
Wenn Sie komplexere Ansichten benötigen, in denen Sie den Lebenszyklus erfassen müssen, z. B. Oncreate, Anforderungsberechtigungen oder Überschreibungen des Lebenszyklus, würde ich ein Dialogfragment verwenden. Auf diese Weise trennen Sie die Berechtigungen und jeden anderen Code, den der Dialog ausführen muss, ohne mit der aufrufenden Aktivität kommunizieren zu müssen.
quelle