with full from codepath activity android dialog android-fragments ontouchevent android-dialogfragment

android - full - Descartar DialogFragment(no Dialog) en TouchOutside



input dialog android (5)

He buscado en todas las respuestas sobre el cierre de Dialog onTouchOutside , sin embargo, estoy usando DialogFragment en mi aplicación. ¿Cómo puedo lograr el cierre de DialogFragment cuando el usuario hace clic fuera de la región de DialogFragment ?

He examinado el código fuente de Dialog 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 encontrar una manera de hacer uso de estos para DialogFragment

Además de estos, he examinado el estado de la aplicación con el visor de hierarchyviewer y, como lo entiendo, solo puedo ver la región del cuadro de diálogo y no la parte del mismo (me refiero a la parte restante de la pantalla después de DialogFragment ).

¿Puede sugerir una forma de implementar este setCanceledOnTouchOutside para DialogFragment y, si es posible, con un código de ejemplo?


¿Por qué no simplemente anular onCreateDialog y simplemente establecerlo allí? De esa manera, no tiene que verificar el valor nulo en la llamada a getDialog() todo el tiempo.

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


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 utiliza android.support.v4.app.DialogFragment .

Lo siguiente funciona bien, ya que se coloca en onCreateView :

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



He respondido a otra pregunta, pero esa respuesta es más apropiada para este problema, Mi solución . Solo para onTouch() aquí, simplemente implementé onTouch() de DialogFragment onTouch() de DialogFragment y verifiqué los límites táctiles.