Tengo un diálogo con EditText
para entrada. Cuando hago clic en el botón "sí" en el cuadro de diálogo, validará la entrada y luego cerrará el cuadro de diálogo. Sin embargo, si la entrada es incorrecta, quiero permanecer en el mismo cuadro de diálogo. Cada vez que sea cual sea la entrada, el diálogo debe cerrarse automáticamente cuando hago clic en el botón "no". ¿Cómo puedo desactivar esto? Por cierto, he usado PositiveButton y NegativeButton para el botón en el diálogo.
android
dialog
android-alertdialog
android-dialog
android-dialogfragment
usuario304881
fuente
fuente
Aquí hay algunas soluciones para todo tipo de cuadros de diálogo, incluida una solución para AlertDialog.Builder que funcionará en todos los niveles de API (funciona por debajo de API 8, que la otra respuesta aquí no). Hay soluciones para AlertDialogs usando AlertDialog.Builder, DialogFragment y DialogPreference.
A continuación se muestran los ejemplos de código que muestran cómo anular el controlador de botón común predeterminado y evitar que el cuadro de diálogo se cierre para estas diferentes formas de cuadros de diálogo. Todos los ejemplos muestran cómo evitar que el botón positivo cierre el cuadro de diálogo.
Nota: Una descripción de cómo funciona el cierre del diálogo debajo del capó para las clases base de Android y por qué se eligen los siguientes enfoques a continuación de los ejemplos, para aquellos que desean más detalles
AlertDialog.Builder - Cambiar el controlador de botón predeterminado inmediatamente después de mostrar ()
DialogFragment - anular onResume ()
DialogPreference - anular showDialog ()
Explicación de enfoques:
fuente
ProgressDialog
cuando se hace clic en él?Una solución alternativa
Me gustaría presentar una respuesta alternativa desde una perspectiva UX.
¿Por qué desearía evitar que se cierre un cuadro de diálogo cuando se hace clic en un botón? Presumiblemente se debe a que tiene un cuadro de diálogo personalizado en el que el usuario no ha hecho una elección o aún no ha completado todo. Y si no están terminados, no debe permitir que hagan clic en el botón positivo. Simplemente desactívelo hasta que todo esté listo.
Las otras respuestas aquí dan muchos trucos para anular el clic positivo del botón. Si eso fuera importante, ¿no habría sido Android un método conveniente para hacerlo? Ellos no lo hicieron.
En cambio, la guía de diseño de Diálogos muestra un ejemplo de tal situación. El botón Aceptar está deshabilitado hasta que el usuario elija. No son necesarios trucos primordiales. Es obvio para el usuario que aún queda algo por hacer antes de continuar.
Cómo deshabilitar el botón positivo
Consulte la documentación de Android para crear un diseño de diálogo personalizado . Se recomienda que coloque su
AlertDialog
interior aDialogFragment
. Entonces, todo lo que necesita hacer es configurar los oyentes en los elementos de diseño para saber cuándo habilitar o deshabilitar el botón positivo.EditText
, entonces use TextWatcher .El botón positivo puede deshabilitarse así:
Aquí hay un trabajo completo
DialogFragment
con un botón positivo deshabilitado, como podría usarse en la imagen de arriba.El diálogo personalizado se puede ejecutar desde una actividad como esta:
Notas
El botón está todavía
null
enonCreateDialog
lo que he deshabilitado enonResume
. Esto tiene el efecto indeseable de deshabilitarlo nuevamente si el usuario cambia a otra aplicación y luego regresa sin cerrar el diálogo. Esto podría resolverse también desmarcando cualquier opción del usuario o llamando aRunnable
desdeonCreateDialog
para deshabilitar el botón en el siguiente ciclo de ejecución.Relacionado
fuente
He escrito una clase simple (un AlertDialogBuilder) que puede usar para deshabilitar la función de descarte automático al presionar los botones del cuadro de diálogo.
También es compatible con Android 1.6, por lo que no utiliza OnShowListener (que solo está disponible API> = 8).
Entonces, en lugar de usar AlertDialog.Builder, puede usar este CustomAlertDialogBuilder. La parte más importante es que no debe llamar a create () , sino solo al método show () . He agregado métodos como setCanceledOnTouchOutside () y setOnDismissListener para que aún pueda configurarlos directamente en el generador.
Lo probé en Android 1.6, 2.x, 3.xy 4.x, por lo que debería funcionar bastante bien. Si encuentra algún problema por favor comente aquí.
EDITAR Aquí hay un pequeño ejemplo sobre cómo usar CustomAlertDialogBuilder:
Salud,
Yuvi
fuente
Context mContext
y configúrelo en el constructor.Aquí está algo si está utilizando
DialogFragment
, que es la forma recomendada de manejar los cuadros de diálogo de todos modos.¿Qué ocurre con AlertDialog del
setButton()
método (y me imagino lo mismo conAlertDialogBuilder
'ssetPositiveButton()
, ysetNegativeButton()
) es que el botón se establece (por ejemploAlertDialog.BUTTON_POSITIVE
) con la realidad va a desencadenar dos diferentesOnClickListener
objetos cuando se presiona.El primer ser DialogInterface.OnClickListener , que es un parámetro a
setButton()
,setPositiveButton()
, ysetNegativeButton()
.El otro es View.OnClickListener , que se configurará para descartar automáticamente
AlertDialog
cuando se presiona cualquiera de sus botones, y se configura porAlertDialog
sí mismo.Lo que puede hacer es usar
setButton()
connull
comoDialogInterface.OnClickListener
, para crear el botón, y luego llame a su método de acción personalizada en el interiorView.OnClickListener
. Por ejemplo,Luego, puede anular los
AlertDialog
'botones' predeterminadosView.OnClickListener
(que de lo contrario cerrarían el cuadro de diálogo) en el métodoDialogFragment
'sonResume()
:¡Necesitará configurar esto en el
onResume()
método porquegetButton()
regresaránull
hasta después de que se haya mostrado el diálogo!Esto debería provocar que su método de acción personalizado solo se llame una vez, y el diálogo no se cerrará de forma predeterminada.
fuente
Inspirado por la respuesta de Tom, creo que la idea aquí es:
onClickListener
durante la creación del diálogo ennull
onClickListener
después de que se muestre el diálogo.Puedes anular al
onShowListener
igual que Tom. Alternativamente, puedesshow()
onClickListener
siguiente manera (un poco más legible, creo).Código:
fuente
Para pre API 8 resolví el problema usando una bandera booleana, un oyente de rechazo y un cuadro de diálogo de llamada. Vuelva a mostrar si en caso de que el contenido de editText no fuera correcto. Me gusta esto:
fuente
La respuesta en este enlace es una solución simple, y que es compatible directamente con la API 3. Es muy similar a la solución de Tom Bollwitt, pero sin usar el OnShowListener menos compatible.
Hice pequeñas adaptaciones al código de Kamen ya que estaba extendiendo un EditTextPreference.
¡Qué divertido!
fuente
Este código funcionará para usted, porque tuve un problema similar y esto funcionó para mí. :)
1- Anular el método Onstart () en tu clase de diálogo de fragmentos.
fuente
Para ProgressDialogs
Para evitar que el diálogo se cierre automáticamente, debe configurar
OnClickListener
después de queProgressDialog
se muestre, así:fuente
fuente
puedes agregar builder.show (); después del mensaje de validación antes de la devolución;
Me gusta esto
fuente
Para evitar que el cuadro de diálogo se cierre al hacer clic y solo debe cerrarse cuando Internet esté disponible
Estoy tratando de hacer lo mismo, ya que no quiero que se cierre el cuadro de diálogo hasta que se conecte a Internet.
Aquí está mi código:
Y aquí está mi código de administrador de conectividad:
fuente
The specified child already has a parent. You must call removeView() on the child's parent first
Si está utilizando
material design
, le sugiero que consulte cuadros de diálogo de materiales . Me solucionó varios problemas relacionados con los errores de Android actualmente abiertos (consulte 78088 ), pero lo más importante para este ticket es que tiene unaautoDismiss
bandera que se puede configurar al usar elBuilder
.fuente
Use un diseño personalizado para su
DialogFragment
y agregue unLinearLayout
debajo de su contenido que se pueda diseñar como sin bordes para que coincida con el diseño de material de Google. Luego encuentre los botones recién creados y anule susOnClickListener
.Ejemplo:
dialog_add_topic.xml :
Este es el resultado final.
fuente
Se podría construir de la manera más fácil:
Diálogo de alerta con vista personalizada y con dos botones (Positivo y Negativo).
CustomClickLister de botón positivo de alerta Dailog :
Hecho
fuente
Esta es probablemente una respuesta muy tardía, pero usar setCancelable hará el truco.
fuente