Estoy usando a DialogFragment
, y aunque he configurado con éxito una imagen para cerrar (es decir, descartar) el cuadro de diálogo cuando se presiona, me cuesta encontrar la manera de cerrar el cuadro de diálogo cuando el usuario hace clic en cualquier lugar fuera de él, tal como funciona diálogos normales. Pensé que habría algún tipo de
dialogFragment.setCanceledOnTouchOutside(true);
llamar, pero no veo eso en la documentación.
¿Es esto posible DialogFragment
en absoluto? ¿O estoy buscando en los lugares equivocados? Intenté interceptar eventos de contacto en la actividad de 'padres' pero, aparte de no obtener ningún evento de contacto, no me pareció correcto.
onCreateView
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getDialog().setCanceledOnTouchOutside(true); ... }
fuente
/** The system calls this only when creating the layout in a dialog. */ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // The only reason you might override this method when using onCreateView() is // to modify any dialog characteristics. For example, the dialog includes a // title by default, but your custom layout might not need it. So here you can // remove the dialog title, but you must call the superclass to get the Dialog. Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCanceledOnTouchOutside(true); return dialog; }
fuente
setCanceledOnTouchOutside
enonCreateView
según @Apurv. Debo mencionar que llamésetCanceledOnTouchOutside(false)
Muchas respuestas aquí, pero la aplicación se bloquea cuando se abre el diálogo. Escribir
getDialog().setCanceledOnTouchOutside(true);
dentroonCreateView
no funcionó y colapsó mi aplicación.(Estoy usando
AppCompatActivity
como mi BaseActivity yandroid.app.DialogFragment
como mi Fragmento).Lo que funciona es cualquiera de las dos líneas siguientes:
O
por dentro
onActivityCreated
como@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom; //getDialog().getWindow().setDimAmount(0.85f); getDialog().setCanceledOnTouchOutside(true);//See here is the code }
Qué no usar:
arroja el siguiente error
¡Y escribir el código
onCreateView
bloquea la aplicación! Actualice la respuesta si encuentra algo incorrecto.fuente
onCreateDialog()
, donde es una forma habitual de inicialización. En este casoonCreateView()
no hace nada e incluso no contiene una vista. Puede intentar mover el código aonCreateDialog()
.onCreateDialog
,onCreateView
en el pasado cercano. Tal vez estoy equivocado, y debería retenerloonActivityCreated
, es un buen método para realizar una inicialización adicional (consulte stackoverflow.com/a/50734566/2914140 , por ejemplo).BottomSheet
implementación. Podría ser diferente en el caso de BSheet Estoy de acuerdo. Pero esta soluciónDialogFragment
funciona bien.DialogFragment.getDialog().setCanceledOnTouchOutside(false);
Estaba escribiendo mal. Yo tuve el mismo problema. Esto funciona bien para Java y Mono para Android Mono será:
this.getDialog().SetCanceledOnTouchOutside(false);
fuente
Dialog.SetCanceledOnTouchOutside(true);
Funcionó para mí
Mi código
class dlgRegister : DialogFragment { public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { .... .... } public override void OnActivityCreated(Bundle savedInstanceState) { Dialog.Window.RequestFeature(WindowFeatures.NoTitle); Dialog.SetCanceledOnTouchOutside(true); base.OnActivityCreated(savedInstanceState); Dialog.Window.Attributes.WindowAnimations = Resource.Style.dialog_animation; } }
fuente
Si desea ejecutar alguna lógica al hacer clic fuera de a
DialogFragment
, simplemente anule el método onCancel.override fun onCancel(dialog: DialogInterface) { super.onCancel(dialog) // Do your work here }
fuente
Recomendaría usar mi solución solo después de probar las soluciones anteriores. He descrito mi solución aquí . Para resumir, estoy comprobando los límites táctiles de DialogFragment.getView (). Cuando los puntos de contacto están fuera de DialogFragment, estoy descartando Dialog.
fuente