Ich habe einen Dialog mit EditText
zur Eingabe. Wenn ich im Dialogfeld auf die Schaltfläche "Ja" klicke, wird die Eingabe überprüft und das Dialogfeld geschlossen. Wenn die Eingabe jedoch falsch ist, möchte ich im selben Dialog bleiben. Unabhängig von der Eingabe sollte der Dialog jedes Mal automatisch geschlossen werden, wenn ich auf die Schaltfläche "Nein" klicke. Wie kann ich das deaktivieren? Übrigens habe ich PositiveButton und NegativeButton für die Schaltfläche im Dialogfeld verwendet.
732
Hier sind einige Lösungen für alle Arten von Dialogen, einschließlich einer Lösung für AlertDialog.Builder, die auf allen API-Ebenen funktioniert (funktioniert unter API 8, was die andere Antwort hier nicht tut). Es gibt Lösungen für AlertDialogs mit AlertDialog.Builder, DialogFragment und DialogPreference.
Im Folgenden finden Sie Codebeispiele, die zeigen, wie Sie den Standardhandler für allgemeine Schaltflächen überschreiben und verhindern, dass der Dialog für diese verschiedenen Formen von Dialogen geschlossen wird. Alle Beispiele zeigen, wie verhindert wird, dass die positive Schaltfläche den Dialog schließt.
Hinweis: Eine Beschreibung, wie das Schließen des Dialogfelds unter der Haube für die Basis-Android-Klassen funktioniert und warum die folgenden Ansätze ausgewählt werden, folgt nach den Beispielen für diejenigen, die weitere Details wünschen
AlertDialog.Builder - Ändert den Standard-Button-Handler unmittelbar nach show ()
DialogFragment - überschreibe onResume ()
DialogPreference - überschreibe showDialog ()
Erklärung der Ansätze:
quelle
ProgressDialog
wenn eine Schaltfläche darauf geklickt wird?Eine alternative Lösung
Ich möchte eine alternative Antwort aus UX-Sicht präsentieren.
Warum möchten Sie verhindern, dass ein Dialogfeld geschlossen wird, wenn auf eine Schaltfläche geklickt wird? Vermutlich liegt es daran, dass Sie einen benutzerdefinierten Dialog haben, in dem der Benutzer noch keine Auswahl getroffen oder noch nicht alles vollständig ausgefüllt hat. Und wenn sie noch nicht fertig sind, sollten Sie ihnen nicht erlauben, überhaupt auf die positive Schaltfläche zu klicken. Deaktivieren Sie es einfach, bis alles fertig ist.
Die anderen Antworten hier geben viele Tricks, um den positiven Klick auf die Schaltfläche zu überschreiben. Wenn das wichtig wäre, hätte Android dann nicht eine bequeme Methode dafür entwickelt? Sie haben es nicht getan.
Stattdessen zeigt der Designleitfaden für Dialoge ein Beispiel für eine solche Situation. Die Schaltfläche OK ist deaktiviert, bis der Benutzer eine Auswahl trifft. Es sind überhaupt keine übergeordneten Tricks erforderlich. Für den Benutzer ist es offensichtlich, dass noch etwas getan werden muss, bevor er fortfährt.
So deaktivieren Sie die positive Taste
Informationen zum Erstellen eines benutzerdefinierten Dialoglayouts finden Sie in der Android-Dokumentation . Es wird empfohlen, dass Sie Ihre
AlertDialog
in einem platzierenDialogFragment
. Anschließend müssen Sie nur noch Listener für die Layoutelemente festlegen, um zu wissen, wann die positive Schaltfläche aktiviert oder deaktiviert werden muss.EditText
, verwenden Sie TextWatcher .Die positive Taste kann folgendermaßen deaktiviert werden:
Hier ist eine vollständige Arbeit
DialogFragment
mit einer deaktivierten positiven Schaltfläche, wie sie im obigen Bild verwendet werden kann.Der benutzerdefinierte Dialog kann über eine Aktivität wie die folgende ausgeführt werden:
Anmerkungen
Der Button ist immer noch
null
inonCreateDialog
so dass ich es in deaktiviertonResume
. Dies hat den unerwünschten Effekt, dass es erneut deaktiviert wird, wenn der Benutzer zu einer anderen App wechselt und dann zurückkehrt, ohne den Dialog zu schließen. Dies könnte gelöst werden, indem auch die Auswahl der Benutzer aufgehoben wird oder indem einRunnable
vononCreateDialog
aufgerufen wird, um die Schaltfläche in der nächsten Ausführungsschleife zu deaktivieren.verbunden
quelle
Ich habe eine einfache Klasse (einen AlertDialogBuilder) geschrieben, mit der Sie die automatische Entlassungsfunktion deaktivieren können, wenn Sie auf die Schaltflächen des Dialogfelds klicken.
Es ist auch mit Android 1.6 kompatibel, verwendet also nicht den OnShowListener (der nur als API> = 8 verfügbar ist).
Anstatt AlertDialog.Builder zu verwenden, können Sie diesen CustomAlertDialogBuilder verwenden. Der wichtigste Teil ist, dass Sie nicht create () aufrufen sollten , sondern nur die show () -Methode. Ich habe Methoden wie setCanceledOnTouchOutside () und setOnDismissListener hinzugefügt damit Sie sie weiterhin direkt im Builder festlegen können.
Ich habe es auf Android 1.6, 2.x, 3.x und 4.x getestet, damit es ziemlich gut funktioniert. Wenn Sie Probleme haben, kommentieren Sie diese bitte hier.
BEARBEITEN Hier ist ein kleines Beispiel für die Verwendung des CustomAlertDialogBuilder:
Prost,
Yuvi
quelle
Context mContext
und legen Sie es stattdessen im Konstruktor fest.Hier ist etwas, wenn Sie verwenden
DialogFragment
- dies ist die empfohlene Methode, um mit Dialogen umzugehen.Was mit der
setButton()
Methode von AlertDialog passiert (und ich stelle mir das auch mitAlertDialogBuilder
'ssetPositiveButton()
und vorsetNegativeButton()
), ist, dass die Schaltfläche, die Sie (z. B.AlertDialog.BUTTON_POSITIVE
) damit setzen,OnClickListener
beim Drücken tatsächlich ZWEI verschiedene Objekte auslöst .Wobei der erste DialogInterface.OnClickListener , die ein Parameter ist
setButton()
,setPositiveButton()
undsetNegativeButton()
.Der andere ist View.OnClickListener , der so eingestellt wird, dass er Sie automatisch schließt ,
AlertDialog
wenn eine seiner Tasten gedrückt wird - und vonAlertDialog
selbst festgelegt wird.Was Sie tun können, ist,
setButton()
mitnull
alsDialogInterface.OnClickListener
zu verwenden, die Schaltfläche zu erstellen und dann Ihre benutzerdefinierte Aktionsmethode darin aufzurufenView.OnClickListener
. Zum Beispiel,Dann können Sie die Standardeinstellung überschreiben
AlertDialog
‚s Tasten‘View.OnClickListener
(was sonst den Dialog entlassen würde) in derDialogFragment
‚s -onResume()
Methode:Sie werden dies in der festlegen müssen
onResume()
Methode , weilgetButton()
zurückkehren wird ,null
bis der Dialog angezeigt wurde!Dies sollte dazu führen, dass Ihre benutzerdefinierte Aktionsmethode nur einmal aufgerufen wird und der Dialog standardmäßig nicht geschlossen wird.
quelle
Inspiriert von Toms Antwort glaube ich, dass die Idee hier ist:
onClickListener
während der Erstellung des Dialogs auf einnull
onClickListener
nachdem der Dialog angezeigt wird.Sie können den
onShowListener
gleichen Tom überschreiben . Alternativ können Sieshow()
onClickListener
wie folgt ein (etwas besser lesbar, denke ich).Code:
quelle
Für Pre-API 8 habe ich das Problem mit einem Booleschen Flag, einem Entlassungs-Listener und einem erneuten Aufruf von dialog.show gelöst, falls der Inhalt des editText nicht korrekt war. So was:
quelle
Die Antwort unter diesem Link ist eine einfache Lösung, die direkt mit API 3 kompatibel ist. Sie ähnelt der Lösung von Tom Bollwitt sehr, verwendet jedoch nicht den weniger kompatiblen OnShowListener.
Ich habe kleinere Anpassungen an Kamens Code vorgenommen, seit ich eine EditTextPreference erweitert habe.
So ein Spaß!
quelle
Dieser Code wird für Sie funktionieren, da ich ein ähnliches Problem hatte und dies für mich funktioniert hat. :) :)
1- Überschreiben Sie die Onstart () -Methode in Ihrer Fragment-Dialog-Klasse.
quelle
Für ProgressDialogs
Um zu verhindern, dass der Dialog automatisch geschlossen wird, müssen Sie Folgendes einstellen,
OnClickListener
nachdem dasProgressDialog
angezeigt wird:quelle
quelle
Sie können builder.show () hinzufügen; nach der Validierungsnachricht vor der Rückkehr;
so was
quelle
So verhindern Sie, dass das Dialogfeld beim Klicken geschlossen wird und nur geschlossen wird, wenn das Internet verfügbar ist
Ich versuche das Gleiche zu tun, da ich nicht möchte, dass das Dialogfeld geschlossen wird, bis das Internet verbunden ist.
Hier ist mein Code:
Und hier ist mein Connectivity Manager-Code:
quelle
The specified child already has a parent. You must call removeView() on the child's parent first
Wenn Sie verwenden,
material design
würde ich vorschlagen, Material-Dialoge zu überprüfen . Es hat einige Probleme für mich behoben, die mit aktuell geöffneten Android-Fehlern zusammenhängen (siehe 78088 ), aber am wichtigsten für dieses Ticket ist,autoDismiss
dass es ein Flag hat, das bei Verwendung von gesetzt werden kannBuilder
.quelle
Verwenden Sie ein benutzerdefiniertes Layout für Ihre
DialogFragment
und fügen SieLinearLayout
unter Ihren Inhalten ein Layout hinzu , das als randlos gestaltet werden kann, um mit Google Material Design übereinzustimmen. Suchen Sie dann die neu erstellten Schaltflächen und überschreiben Sie derenOnClickListener
.Beispiel:
dialog_add_topic.xml :
Dies ist das Endergebnis.
quelle
Es könnte auf einfachste Weise gebaut werden:
Warndialog mit benutzerdefinierter Ansicht und mit zwei Schaltflächen (positiv und negativ).
CustomClickLister of Positive Button von Alert Dailog :
Erledigt
quelle
Dies ist wahrscheinlich eine sehr späte Antwort, aber die Verwendung von setCancelable reicht aus.
quelle