Google recomienda que usemos en DialogFragment
lugar de un simple Dialog
mediante el uso Fragments API
, pero es absurdo usar un DialogFragment
cuadro de mensaje de confirmación aislado para un simple Sí-No. ¿Cuál es la mejor práctica en este caso?
244
Dialog
oAlertDialog.Builder::create()::show()
creará un cuadro de diálogo que desaparecerá cuando gire la pantalla.Respuestas:
Sí, use
DialogFragment
yonCreateDialog
puede simplemente usar un generador de AlertDialog de todos modos para crear un simpleAlertDialog
con los botones de confirmación Sí / No. No hay mucho código en absoluto.Con respecto al manejo de eventos en su fragmento, habría varias formas de hacerlo, pero simplemente defino un mensaje
Handler
en miFragment
, lo paso aDialogFragment
través de su constructor y luego paso los mensajes al controlador de mi fragmento según corresponda en los diversos eventos de clic. De nuevo varias formas de hacerlo, pero lo siguiente funciona para mí.En el cuadro de diálogo, mantenga un mensaje y ejemplifíquelo en el constructor:
Implemente el
onClickListener
en su diálogo y luego llame al controlador según corresponda:Editar
Y como
Message
es parcelable, puede guardarloonSaveInstanceState
y restaurarloEntonces en
onCreate
fuente
target
que será nulo si lo carga desde un paquete. Si el objetivo de un mensaje es nulo, y usted lo usasendToTarget
, obtendrá una excepción NullPointerException, no porque el mensaje sea nulo, sino porque su objetivo sí lo es.Puede crear subclases genéricas de DialogFragment como YesNoDialog y OkDialog, y pasar el título y el mensaje si usa mucho los diálogos en su aplicación.
Luego llámalo usando lo siguiente:
Y maneje el resultado adentro
onActivityResult
.fuente
YES_NO_CALL
,getFragmentManager()
yonActivityResult
?YES_NO_CALL
es un int personalizado que es el código de solicitud.getFragmentManager()
obtiene el administrador de fragmentos para la actividad yonActivityResult()
es un método de devolución de llamada de ciclo de vida de fragmentos.Use DialogFragment sobre AlertDialog:
Desde la introducción del nivel 13 de API :
la showDialog método de la Actividad está en desuso . No es aconsejable invocar un cuadro de diálogo en otra parte del código, ya que tendrá que administrar el cuadro de diálogo usted mismo (por ejemplo, cambio de orientación).
DiálogoFragmento de diferencia - AlertDialog
¿Son muy diferentes? De la referencia de Android con respecto a DialogFragment :
Otras notas
fuente
Yo recomendaría usar
DialogFragment
.Claro, crear un cuadro de diálogo "Sí / No" con él es bastante complejo teniendo en cuenta que debería ser una tarea bastante simple, pero crear un cuadro de diálogo similar también
Dialog
es sorprendentemente complicado.(El ciclo de vida de la actividad lo hace complicado, debe permitir
Activity
administrar el ciclo de vida del cuadro de diálogo, y no hay forma de pasar parámetros personalizados, por ejemplo, el mensaje personalizadoActivity.showDialog
si se usan niveles API inferiores a 8)Lo bueno es que generalmente puedes construir tu propia abstracción además de
DialogFragment
bastante fácilmente.fuente
String
parámetro. Cuando el usuario hace clic en "Sí", por ejemplo, el cuadro de diálogo llama al método de la Actividad con el parámetro "aceptar". Estos parámetros se especifican al mostrar el diálogo, por ejemplo AskDialog.ask ("¿Está de acuerdo con estos términos?", "De acuerdo", "en desacuerdo");FragmentManager
'sfindFragmentByTag
. Pero sí, requiere un poco de código.Fragment
this
y tenerActivity
extends
suInterface
. Sin embargo, con cuidado de enhebrar, podría estar saltando las llamadas de la interfaz cuando no necesariamente las quiere si su concurrencia no está bajo control. Sin embargo, no estoy seguro de lo que esto hace con la memoria y los espaguetis de dependencia circular, ¿a alguien más le gustaría intervenir? La otra opción esMessage
/Handler
pero aún puede tener problemas de concurrencia.Generic AlertDialogFragment with Builder Pattern
En mi proyecto, que ya se utiliza
AlertDialog.Builder
ya mucho antes de descubrir que es problemático. Sin embargo, no quería cambiar tanto código en ninguna parte de mi aplicación. Además, en realidad soy fanático de pasarOnClickListeners
como clases anónimas donde se necesitan (es decir, cuando se usasetPositiveButton()
,setNegativeButton()
etc.) en lugar de tener que implementar miles de métodos de devolución de llamada para comunicarse entre un fragmento de diálogo y el fragmento del titular, que puede, en mi opinión, lleva a un código muy confuso y complejo. Especialmente, si tiene múltiples diálogos diferentes en un fragmento y luego necesita distinguir en las implementaciones de devolución de llamada entre qué diálogo se muestra actualmente.Por lo tanto, combiné diferentes enfoques para crear una
AlertDialogFragment
clase auxiliar genérica que se puede usar exactamente comoAlertDialog
:SOLUCIÓN
( TENGA EN CUENTA que estoy usando expresiones lambda de Java 8 en mi código, por lo que es posible que tenga que cambiar partes del código si aún no está usando expresiones lambda ).
USO
Estoy publicando esto aquí no solo para compartir mi solución, sino también porque quería pedirles a las personas su opinión: ¿Es este enfoque legítimo o problemático hasta cierto punto?
fuente
¿Puedo sugerir una pequeña simplificación de la respuesta de @ ashishduh:
Elimina la necesidad de que el usuario (de la clase) esté familiarizado con los componentes internos del componente y hace que el uso sea realmente simple:
PD: En mi caso, necesitaba un diálogo de alerta simple, así que eso fue lo que creé. Puede aplicar el enfoque a un Sí / No o cualquier otro tipo que necesite.
fuente
Utilice Diálogo para cuadros de diálogo simples de sí o no.
Cuando necesite vistas más complejas en las que necesite obtener el ciclo de vida, como oncreate, solicitar permisos, cualquier anulación del ciclo de vida, usaría un fragmento de diálogo. Por lo tanto, separa los permisos y cualquier otro código que el diálogo necesita para operar sin tener que comunicarse con la actividad de llamada.
fuente