40

Ho un frammento che può creare e far apparire un DialogFragment, ma quando premo il pulsante Indietro, chiude la finestra di dialogo anche se io chiamo esplicitamente setCancelable (false); C'è un modo per il mio DialogFragment di essere insensibile al pulsante Indietro?Android: Come impedire al pulsante Indietro di cancellare una 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 il FragmentDialog da 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(); 
    } 
} 

risposta

94

Come sull'utilizzo setCancelable? Hai provato?

Dalla documentazione -

controllo se la finestra di dialogo mostrata è annullabile. Utilizzare questo invece di chiamando direttamente Dialog.setCancelable (booleano), perché DialogFragment necessità di cambiare il suo comportamento sulla base di questo

+29

questo è corretto! risulta che è necessario chiamare setCancelable (false) sul DialogFragment stesso, non la finestra di dialogo interna che contiene! – MattF

+1

@MattF Questo commento è un risparmiatore di vita. Non ho capito che avevo bisogno di chiamare 'setCancelable()' su 'DialogFragment' invece di' ProgressDialog'. Grazie! – prolink007

4

io non sono affatto sicuro se questo sarà il lavoro con FragmentDialogs, ma se il setCancelable non ha funzionato per te, potrebbe valere la pena dare un'occhiata a questo articolo: Android: Prompt user to save changes when Back button is pressed

Spiega come rilevare il pulsante Indietro premuto. Quindi forse puoi sopprimere la pressione del pulsante e impedirà la chiusura del dialogo?

+0

Ho finito per andare con l'altra risposta, ma penso che funzioni anche così, molte grazie – MattF

1

Può esserti utile.

newFragment.setCancelable(false); 

apportare modifiche come sopra durante la creazione oggetto DialogFragment o nel costruttore personalizzato DialogFragment come nell'esempio riportato di seguito.

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