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);
}
Estaba leyendo: http://developer.android.com/reference/android/app/DialogFragment.html
Dice: "El control del cuadro de diálogo (decidir cuándo mostrarlo, ocultarlo o descartarlo) se debe realizar a través de la API aquí, no con llamadas directas en el cuadro de diálogo".
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.
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()
Consulte http://developer.android.com/reference/android/app/DialogFragment.html#setShowsDialog%28boolean%29 para obtener más información acerca de los diálogos en DialogFragments.