40

Tengo un Fragmento que puede crear y abrir un DialogFragment, pero cuando presiono el botón Atrás, descarta el diálogo aunque explícitamente llame a setCancelable (falso); ¿Hay alguna forma para que DialogFragment sea insensible al botón Atrás?Android: Cómo evitar que el botón Atrás cancele un FragmentDialog

public class LoadingDialogFragment extends DialogFragment 
{ 
    String title; 
    String msg; 

    public LoadingDialogFragment() 
    { 
     this.title = "Loading..."; 
     this.msg = "Please wait..."; 
    } 
    public LoadingDialogFragment(String title, String msg) 
    { 
     this.title = title; 
     this.msg = msg; 
    } 

    @Override 
    public Dialog onCreateDialog(final Bundle savedInstanceState) 
    { 
     final ProgressDialog dialog = new ProgressDialog(getActivity()); 

     dialog.setTitle(title); 
     dialog.setMessage(msg); 
     dialog.setIndeterminate(true); 
     dialog.setCanceledOnTouchOutside(false); 
     dialog.setCancelable(false); 

     return dialog; 
    } 

} 

creo el FragmentDialog de un AsyncTask:

private class GpsTask extends AsyncTask<String, Integer, Integer> 
{ 
    //ProgressDialog dialog; 
    @Override 
    protected void onPreExecute() 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     DialogFragment newFragment = new LoadingDialogFragment("Gathering Location", "Acquiring GPS lock..."); 
     ft.addToBackStack(null); 
     newFragment.show(ft, "dialog"); 
    } 

    @Override 
    protected Integer doInBackground(String... params) 
    { 
     //acquire a GPS lock and grab a few position updates 
    } 

    @Override 
    protected void onProgressUpdate(Integer... input) { } 

    @Override 
    protected void onPostExecute(Integer result) 
    { 
     getSupportFragmentManager().popBackStackImmediate(); 
    } 
} 

Respuesta

94

Cómo sobre el uso setCancelable? ¿Lo intentaste?

De los Docs -

controlar si el cuadro de diálogo mostrado es cancelable. Utilizar esto en vez de llamando directamente Dialog.setCancelable (booleano), porque DialogFragment necesita cambiar su comportamiento en base a este

+29

¡Esto es correcto! resulta que debes llamar a setCancelable (falso) en el DialogFragment, ¡no al Diálogo interno que contiene! – MattF

+1

@MattF Este comentario es un salvavidas. No me di cuenta de que necesitaba llamar a 'setCancelable()' en el 'DialogFragment' en lugar de' ProgressDialog'. ¡Gracias! – prolink007

4

No estoy del todo seguro de si esto funcionará con FragmentDialogs, pero si el setCancelable no funcionó para usted, podría valer la pena echarle un vistazo a este artículo: Android: Prompt user to save changes when Back button is pressed

Explica cómo detectar el botón Atrás que se está presionando. Entonces, ¿tal vez puede suprimir el botón presionar y se detendrá el diálogo de cierre?

+0

Terminé yendo con la otra respuesta, pero creo que esto también funciona, muchas gracias – MattF

1

Puede ser de ayuda.

newFragment.setCancelable(false); 

hacer cambios como anteriormente al crear objetos DialogFragment o en el constructor de DialogFragment personalizado como en el ejemplo siguiente.

public static CustomClearHourDialog newInstance(Bundle args, IDialogListener listener) 
     { 
      CustomClearHourDialog clearHourDialog = new CustomClearHourDialog();    
      CustomClearHourDialog.listener = listener; 
      clearHourDialog.setCancelable(false); 
      return clearHourDialog; 
     } 
Cuestiones relacionadas