Ich versuche zu verhindern, dass mit dem Alert Builder erstellte Dialoge beim Neustart der Aktivität geschlossen werden.
Wenn ich die onConfigurationChanged-Methode überlade, kann ich dies erfolgreich tun und das Layout auf die richtige Ausrichtung zurücksetzen, aber ich verliere die Sticky-Text-Funktion von edittext. Bei der Lösung des Dialogproblems habe ich dieses Edittext-Problem erstellt.
Wenn ich die Zeichenfolgen aus dem Edittext speichere und sie in der onCofiguration-Änderung neu zuordne, scheinen sie immer noch standardmäßig den Anfangswert zu haben, nicht den, der vor der Drehung eingegeben wurde. Selbst wenn ich eine Ungültigmachung erzwinge, scheinen sie zu aktualisieren.
Ich muss wirklich entweder das Dialogproblem oder das Edittext-Problem lösen.
Danke für die Hilfe.
Antworten:
Der beste Weg, um dieses Problem heutzutage zu vermeiden, ist die Verwendung von a
DialogFragment
.Erstellen Sie eine neue Klasse, die erweitert wird
DialogFragment
. Überschreiben SieonCreateDialog
und geben Sie Ihr altesDialog
oder einAlertDialog
.Dann können Sie es mit zeigen
DialogFragment.show(fragmentManager, tag)
.Hier ist ein Beispiel mit einem
Listener
:Und in der Aktivität, die Sie anrufen:
Diese Antwort hilft bei der Erklärung dieser anderen drei Fragen (und ihrer Antworten):
quelle
onAttach
jetzt veraltet ist. Was ist stattdessen zu tun?onAttach(Context context)
und verwendenandroid.support.v4.app.DialogFragment
. DieonAttach
Methode nimmt jetztcontext
stattactivity
als Parameter.YesNoListener
. Siehe diese Antwort .quelle
Context
Einfügen in die Dialogschaltflächen erfordertOnClickListener
.Wenn Sie das Layout bei einer Orientierungsänderung ändern, würde ich es nicht sagen
android:configChanges="orientation"
in Ihr Manifest aufnehmen, da Sie die Ansichten sowieso neu erstellen.Speichern Sie den aktuellen Status Ihrer Aktivität (wie eingegebener Text, angezeigter Dialog, angezeigte Daten usw.) mit den folgenden Methoden:
Auf diese Weise durchläuft die Aktivität erneut onCreate und ruft anschließend die onRestoreInstanceState-Methode auf, mit der Sie Ihren EditText-Wert erneut festlegen können.
Wenn Sie komplexere Objekte speichern möchten, können Sie diese verwenden
Hier können Sie jedes Objekt speichern und in onCreate müssen Sie nur aufrufen
getLastNonConfigurationInstance();
, um das Objekt zu erhalten.quelle
OnRetainNonConfigurationInstance()
ist jetzt veraltet, wie der Doc sagt: developer.android.com/reference/android/app/…setRetainInstance(boolean retain)
sollte stattdessen verwendet werden: developer.android.com/reference/android/app/…setRetainInstance
ist völlig anders: Es ist für Fragmente und garantiert nicht, dass die Instanz beibehalten wird.Fügen Sie einfach android: configChanges = "Orientierung" mit Ihrem Aktivitätselement in AndroidManifest.xml hinzu
Beispiel:
quelle
Ein sehr einfacher Ansatz besteht darin, die Dialoge aus der Methode zu erstellen
onCreateDialog()
(siehe Hinweis unten). Sie zeigen sie durchshowDialog()
. Auf diese Weise, Android übernimmt die Rotation für Sie und Sie müssen nicht nennendismiss()
inonPause()
einer WindowLeak zu vermeiden und dann weder Sie müssen den Dialog wiederherzustellen. Aus den Dokumenten:Weitere Informationen finden Sie in den Android-Dokumenten showDialog () . Hoffe es hilft jemandem!
Hinweis: Wenn Sie AlertDialog.Builder verwenden, rufen Sie nicht
show()
von anonCreateDialog()
,create()
sondern rufen Sie stattdessen an. Wenn Sie ProgressDialog verwenden, erstellen Sie einfach das Objekt, legen Sie die gewünschten Parameter fest und geben Sie es zurück. Zusammenfassend lässt sich sagen, dassshow()
InsideonCreateDialog()
Probleme verursacht. Erstellen Sie einfach die de Dialog-Instanz und geben Sie sie zurück. Das sollte funktionieren! (Ich habe Probleme bei der Verwendung von showDialog () von onCreate () festgestellt - der Dialog wird tatsächlich nicht angezeigt -, aber wenn Sie ihn in onResume () oder in einem Listener-Rückruf verwenden, funktioniert er gut).quelle
AlertDialog.Builder
. Wenn Sie es im Inneren verwendenonCreateDialog()
, geben Sie anstelle vonshow()
return das Ergebnis von zurückcreate()
.show()
Andernfalls rufen Sie den zurückgegebenen AlertDialog auf und speichern ihn in einem Attribut der Aktivität undonPause()
dismiss()
darin, wenn er angezeigt wird, um ein WindowLeak zu vermeiden. Ich hoffe es hilft!Diese Frage wurde vor langer Zeit beantwortet.
Dies ist jedoch nicht hacky und einfach Lösung, die ich für mich selbst verwende.
Ich habe diese Helferklasse gemacht für mich selbst gemacht, damit Sie sie auch in Ihrer Anwendung verwenden können.
Verwendung ist:
Oder
quelle
Sie können die onSave / onRestore- Methoden des Dialogfelds mit den onSave / onRestore- Methoden der Aktivität kombinieren , um den Status des Dialogfelds beizubehalten .
Hinweis: Diese Methode eignet sich für "einfache" Dialoge, z. B. zum Anzeigen einer Warnmeldung. Der Inhalt einer in einen Dialog eingebetteten WebView wird nicht reproduziert. Wenn Sie wirklich verhindern möchten, dass ein komplexer Dialog während der Rotation geschlossen wird, versuchen Sie die Methode von Chung IW.
quelle
Der beste Ansatz ist auf jeden Fall die Verwendung von DialogFragment.
Hier ist meine Lösung der Wrapper-Klasse, die verhindert, dass verschiedene Dialoge innerhalb eines Fragments (oder einer Aktivität mit kleinem Refactoring) geschlossen werden. Es hilft auch, massives Code-Refactoring zu vermeiden, wenn aus bestimmten Gründen viele
AlertDialogs
im Code verstreut sind und sich geringfügig in Bezug auf Aktionen, Erscheinungsbild oder etwas anderes unterscheiden.Wenn es um die Aktivität kommt , kann man aufrufen
getContext()
innenonCreateDialog()
, werfen es in dieDialogProvider
Schnittstelle und anfordern , indem Sie einen bestimmten DialogmDialogId
. Alle Logik zum Umgang mit einem Zielfragment sollte gelöscht werden.Verwendung aus Fragment:
Sie können den vollständigen Artikel in meinem Blog lesen. Wie kann verhindert werden, dass Dialog entlassen wird? und mit dem Quellcode spielen .
quelle
Es scheint, dass dies immer noch ein Problem ist, selbst wenn "alles richtig gemacht" und verwendet wird
DialogFragment
usw. verwendet wird.In Google Issue Tracker gibt es einen Thread, der behauptet, dass eine alte Entlassungsnachricht in der Nachrichtenwarteschlange verbleibt. Die bereitgestellte Problemumgehung ist recht einfach:
Unglaublich, dass dies noch 7 Jahre nach der ersten Meldung dieses Problems erforderlich ist.
quelle
Ich hatte ein ähnliches Problem: Als sich die Bildschirmausrichtung änderte, wurde der
onDismiss
Listener des Dialogfelds aufgerufen, obwohl der Benutzer das Dialogfeld nicht geschlossen hatte. Ich konnte dies umgehen, indem ich stattdessen denonCancel
Listener verwendete, der sowohl beim Drücken der Zurück-Taste als auch beim Berühren des Benutzers außerhalb des Dialogfelds ausgelöst wurde.quelle
Benutz einfach
und die App weiß, wie man mit Rotation und Bildschirmgröße umgeht.
quelle