Estoy tratando de evitar que los cuadros de diálogo creados con el generador de alertas se descarten cuando se reinicia la actividad.
Si sobrecargo el método onConfigurationChanged, puedo hacer esto con éxito y restablecer el diseño a la orientación correcta, pero pierdo la función de texto adhesivo de edittext. Entonces, al resolver el problema del diálogo, he creado este problema de edición de texto.
Si guardo las cadenas del texto de edición y las reasigno en el cambio onCofiguration, todavía parecen tener el valor inicial predeterminado, no el que se ingresó antes de la rotación. Incluso si fuerzo una invalidación, parece actualizarlos.
Realmente necesito resolver el problema del diálogo o el problema de editar texto.
Gracias por la ayuda.
Respuestas:
La mejor manera de evitar este problema hoy en día es utilizando un archivo
DialogFragment
.Cree una nueva clase que se extienda
DialogFragment
. AnulaonCreateDialog
y devuelve tu antiguoDialog
o unAlertDialog
.Entonces puedes mostrarlo con
DialogFragment.show(fragmentManager, tag)
.Aquí tienes un ejemplo con
Listener
:Y en la Actividad llamas:
Esta respuesta ayuda a explicar estas otras tres preguntas (y sus respuestas):
fuente
onAttach
ahora está en desuso. ¿Qué debería hacerse en su lugar?onAttach(Context context)
yandroid.support.v4.app.DialogFragment
. ElonAttach
método toma ahora como parámetro encontext
lugar deactivity
.YesNoListener
embargo , probablemente no sea necesario . Vea esta respuesta .fuente
Context
dentro de los botones de diálogoOnClickListener
.Si está cambiando el diseño en el cambio de orientación, no lo pondría
android:configChanges="orientation"
en su manifiesto porque está recreando las vistas de todos modos.Guarde el estado actual de su actividad (como el texto ingresado, el diálogo mostrado, los datos mostrados, etc.) utilizando estos métodos:
De esa manera, la actividad pasa por onCreate nuevamente y luego llama al método onRestoreInstanceState donde puede establecer su valor EditText nuevamente.
Si desea almacenar objetos más complejos, puede usar
Aquí puede almacenar cualquier objeto y en onCreate solo tiene que llamar
getLastNonConfigurationInstance();
para obtener el objeto.fuente
OnRetainNonConfigurationInstance()
ahora está en desuso como dice el documento: developer.android.com/reference/android/app/…setRetainInstance(boolean retain)
debería usarse en su lugar: developer.android.com/reference/android/app/…setRetainInstance
es completamente diferente: es para Fragments y no le garantiza que se retendrá la instancia.Simplemente agregue android: configChanges = "Orientación" con su elemento de actividad en AndroidManifest.xml
Ejemplo:
fuente
Un enfoque muy sencillo es crear los diálogos a partir del método
onCreateDialog()
(consulte la nota a continuación). Les muestras a travésshowDialog()
. De esta manera, Android se encarga de la rotación para usted y usted no tiene que llamardismiss()
enonPause()
evitar una WindowLeak y luego no tener que restaurar el diálogo. De los documentos:Consulte los documentos de Android showDialog () para obtener más información. ¡Espero que ayude a alguien!
Nota: Si usa AlertDialog.Builder, no llame
show()
desdeonCreateDialog()
, llame en sucreate()
lugar. Si usa ProgressDialog, simplemente cree el objeto, establezca los parámetros que necesita y devuélvalo. En conclusión,show()
insideonCreateDialog()
causa problemas, simplemente cree la instancia de Dialog y devuélvala. ¡Esto debería funcionar! (He tenido problemas al usar showDialog () desde onCreate () -en realidad no muestra el diálogo-, pero si lo usa en onResume () o en una devolución de llamada de oyente, funciona bien).fuente
AlertDialog.Builder
. Si lo usa en el interioronCreateDialog()
, en lugar de usar,show()
devuelva el resultado decreate()
. De lo contrario, llameshow()
y almacene el AlertDialog devuelto en un atributo de la Actividad y enonPause()
dismiss()
él si se muestra para evitar un WindowLeak. ¡Espero eso ayude!Esta pregunta fue respondida hace mucho tiempo.
Sin embargo, esta es una solución simple y no pirateada que uso para mí.
Hice esta clase de ayuda por mí mismo, por lo que también puede usarla en su aplicación.
El uso es:
O
fuente
Puede combinar los métodos onSave / onRestore de Dialog con los métodos onSave / onRestore de Activity para mantener el estado del Dialog.
Nota: este método funciona para esos cuadros de diálogo "simples", como mostrar un mensaje de alerta. No reproducirá el contenido de un WebView incrustado en un diálogo. Si realmente desea evitar que se elimine un diálogo complejo durante la rotación, pruebe el método de Chung IW.
fuente
Definitivamente, el mejor enfoque es usar DialogFragment.
Aquí está la solución mía de la clase contenedora que ayuda a evitar que se descarten diferentes diálogos dentro de un Fragmento (o Actividad con pequeña refactorización). Además, ayuda a evitar la refactorización masiva de código si, por alguna razón, hay muchos
AlertDialogs
códigos dispersos con ligeras diferencias entre ellos en términos de acciones, apariencia o algo más.Cuando se trata de Actividad, puede invocarlo
getContext()
dentroonCreateDialog()
, enviarlo a laDialogProvider
interfaz y solicitar un diálogo específico pormDialogId
. Se debe eliminar toda la lógica para tratar con un fragmento de destino.Uso del fragmento:
Puedes leer el artículo completo en mi blog ¿Cómo evitar que se cierre el diálogo? y juega con el código fuente .
fuente
Parece que esto sigue siendo un problema, incluso cuando se "hace todo bien" y se usa,
DialogFragment
etc.Hay un hilo en Google Issue Tracker que afirma que se debe a que se ha dejado un mensaje de descarte antiguo en la cola de mensajes. La solución alternativa proporcionada es bastante simple:
Es increíble que esto siga siendo necesario 7 años después de que se informó por primera vez de ese problema.
fuente
Tuve un problema similar: cuando cambió la orientación de la pantalla,
onDismiss
se llamó al oyente del cuadro de diálogo aunque el usuario no descartó el cuadro de diálogo. Pude solucionar esto utilizando en su lugar elonCancel
oyente, que se activaba tanto cuando el usuario presionaba el botón Atrás como cuando el usuario tocaba fuera del cuadro de diálogo.fuente
Solo usa
y la aplicación sabrá cómo manejar la rotación y el tamaño de la pantalla.
fuente