19

He buscado por todas las respuestas sobre el despido de un diálogo onTouchOutside, sin embargo, estoy usando DialogFragment en mi solicitud. ¿Cómo puedo lograr despedir al DialogFragment cuando el usuario hace clic fuera de la región DialogFragment?despedir DialogFragment (no de diálogo) onTouchOutside

He examinado diálogo 's source code para setCanceledOnTouchOutside

public void setCanceledOnTouchOutside(boolean cancel) { 
    if (cancel && !mCancelable) { 
     mCancelable = true; 
    } 

    mCanceledOnTouchOutside = cancel; 
} 

Hay otra función que puede ser interesante que es isOutOfBounds

private boolean isOutOfBounds(MotionEvent event) { 
    final int x = (int) event.getX(); 
    final int y = (int) event.getY(); 
    final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop(); 
    final View decorView = getWindow().getDecorView(); 
    return (x < -slop) || (y < -slop) 
    || (x > (decorView.getWidth()+slop)) 
    || (y > (decorView.getHeight()+slop)); 
} 

pero no pude averiguar una forma de hacer uso de estos para DialogFragment

Además de estos que han examinado el estado de la aplicación con hierarchyviewer y como yo lo entiendo, sólo puede ver la región del diálogo y no la parte outsied de ella (me refiero a la parte restante de la pantalla después del DialogFragment).

puede sugerir una forma de implementar esta setCanceledOnTouchOutside para DialogFragment y si es posible con un código de ejemplo?

Respuesta

34

La respuesta es bastante simple:

MyDialogFragment fragment = new MyDialogFragment(); // init in onCreate() or somewhere else 
... 
if (fragment.getDialog() != null) 
    fragment.getDialog().setCanceledOnTouchOutside(true); // after fragment has already dialog, i. e. in onCreateView() 

Ver http://developer.android.com/reference/android/app/DialogFragment.html#setShowsDialog%28boolean%29 para obtener más información sobre los cuadros de diálogo en DialogFragments.

+0

'DialogFragment' no tiene un método llamado' setCanceledOnTouchOutside() '' Dialog'. Por favor lea la pregunta cuidadosamente. –

+12

La respuesta anterior no implica que tenga. 'DialogFragment' tiene el método' getDialog() 'que devuelve' Dialog' que tiene el método 'setCanceledOnTouchOutside()'. Por favor, lea la respuesta cuidadosamente. –

+3

Oh hombre ... por favor sé más descriptivo ... Si puedes editar la respuesta, puedo votarla. Lo he llamado dentro de 'onCreateView()' de una implementación personalizada 'DialogFragment' y funciona bien. Gracias. –

10

En la mayoría de los casos, getDialog() es nulo, ya que no lo obtendrá inmediatamente después de crear una nueva instancia de su cuadro de diálogo.

Como se sugirió anteriormente onViewCreated tampoco es correcto para DialogFragment especialmente cuando se usa android.support.v4.app.DialogFragment.

El siguiente funciona bien, ya que está colocado en la onCreateView:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if (getDialog() != null) { 
     getDialog().setCanceledOnTouchOutside(true); 
    } 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 
+1

Debe ser la respuesta aceptada – Kibi

+0

Anule este método en su DialogFragment. Eso no estaba claro al principio ya que comúnmente se anula en Fragmentos. – Ivan

4

Por qué no sólo anula onCreateDialog y acaba de establecer allí. De esta forma, no tiene que verificar nulo en la llamada getDialog() todo el tiempo.

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog d = super.onCreateDialog(savedInstanceState); 
    d.setCanceledOnTouchOutside(false); 
    return d; 
} 
0

he respondido a otra pregunta, pero la respuesta es más apropiada para este problema, My solution.Solo para resumir aquí, simplemente implementé onTouch() de DialogFragment de getView() y marqué límites táctiles.

Cuestiones relacionadas