¿Cómo descartar un DialogFragment al presionar fuera del cuadro de diálogo?

80

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 DialogFragmenten 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.

único
fuente

Respuestas:

177
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

Debe ser llamado onCreateView(como señaló Apurv Gupta).

Hamed
fuente
34
Debe ser llamado enonCreateView
Apurv Gupta
¿Qué pasa si no quiero que se cancele, sino que simplemente se cierre?
jjxtra
58
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }
manuzhang
fuente
в моем случае getDialog (). setCanceledOnTouchOutside (verdadero); не сработало, сработало getDialog (). desechar ();
Максим Фомичёв
@ МаксимФомичёв, в первом случае происходит установка свойства диалога, что его можно закужарить. Во втором случае вы сами программно закрываете диалог.
CoolMind
21
    /** 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;
    }
Yakiv Mospan
fuente
esto no funcionó para mí. Tuve que llamar setCanceledOnTouchOutsideen onCreateViewsegún @Apurv. Debo mencionar que llamésetCanceledOnTouchOutside(false)
kimbaudi
8

Muchas respuestas aquí, pero la aplicación se bloquea cuando se abre el diálogo. Escribir getDialog().setCanceledOnTouchOutside(true);dentro onCreateViewno funcionó y colapsó mi aplicación.

(Estoy usando AppCompatActivitycomo mi BaseActivity y android.app.DialogFragmentcomo mi Fragmento).

Lo que funciona es cualquiera de las dos líneas siguientes:

getDialog (). setCanceledOnTouchOutside (verdadero);

O

this.getDialog (). setCanceledOnTouchOutside (verdadero);

por dentro onActivityCreatedcomo

@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:

DialogFragment.getDialog (). SetCanceledOnTouchOutside (falso);

arroja el siguiente error

ingrese la descripción de la imagen aquí

¡Y escribir el código onCreateViewbloquea la aplicación! Actualice la respuesta si encuentra algo incorrecto.

sud007
fuente
Probablemente esto se deba a que crea un cuadro de diálogo en el interior onCreateDialog(), donde es una forma habitual de inicialización. En este caso onCreateView()no hace nada e incluso no contiene una vista. Puede intentar mover el código a onCreateDialog().
CoolMind
@CoolMind Oh, esa es una buena observación. Seguramente mantendré esto en mi lista de intentos. ¡Gracias!
sud007
Creo que su respuesta, sin embargo, tiene sentido, y 4 personas marcaron más. También tuve problemas con onCreateDialog, onCreateViewen el pasado cercano. Tal vez estoy equivocado, y debería retenerlo onActivityCreated, es un buen método para realizar una inicialización adicional (consulte stackoverflow.com/a/50734566/2914140 , por ejemplo).
CoolMind
@CoolMind agradable que funciona para ti. Pero puedo notar que los problemas que está experimentando se deben a su BottomSheetimplementación. Podría ser diferente en el caso de BSheet Estoy de acuerdo. Pero esta solución DialogFragmentfunciona bien.
sud007
3
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);
Eugene Bosikov
fuente
Pero, ¿quién preguntó algo sobre Mono? : /
m0skit0
1
            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;
            }
    }
impostor
fuente
1

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
}
Thomas
fuente
0

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.

Swaroop
fuente