2011-09-07 19 views
17

Estoy usando un ProgressDialog administrado como Fragment. Incluso si configuro el ProgressDialog como no cancelable, el botón ATRÁS seguirá funcionando para eliminar ese Fragment de la pila. Mi mirada interna clase como esta:¿Cómo establecer el diálogo de progreso como no cancelable cuando se gestiona como un fragmento?

public static class ProgressDialogFragment extends DialogFragment { 

    private DialogStyle dialogStyle; 

    public static ProgressDialogFragment newInstance(String title, String message) { 
     ProgressDialogFragment fragment = new ProgressDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putString("title", title); 
     args.putString("message", message); 
     fragment.setArguments(args); 

     return fragment; 
    } 

    public void setDialogStyle(DialogStyle dialogStyle) { 
     this.dialogStyle = dialogStyle; 
    } 


    @Override 
    public ProgressDialog onCreateDialog(Bundle savedInstanceState) { 
     String title = getArguments().getString("title"); 
     String message = getArguments().getString("message"); 

     ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
     progressDialog.setTitle(title); 
     progressDialog.setMessage(message); 

     if(dialogStyle!=null) { 
      switch (dialogStyle) { 
       case CANCELABLE: 
        progressDialog.setCancelable(true); 
        break; 
       case NON_CANCELABLE: 
        progressDialog.setCancelable(false); 
        break; 

      } 
     } else { 
      progressDialog.setCancelable(false); 
     } 

     progressDialog.show(); 

     return progressDialog; 
    } 
} 

Y entonces el método expongo es:

public void showProgressDialog(String title, String message, DialogStyle dialogStyle) { 
      Fragment prev = fragmentManager.findFragmentByTag("progress dialog"); 
      if(prev!=null) { 
       ft.remove(prev); 
      } 
      ft.addToBackStack(null); 

      DialogFragment newFragment = ProgressDialogFragment.newInstance(title, message); 
      ((ProgressDialogFragment)newFragment).setDialogStyle(dialogStyle); 
      newFragment.show(fragmentManager, "progress dialog"); 
     } 

Así la confusión obvia aquí es que el botón BACK elimina la ProgressDialog porque está siendo manejada como una Fragment. Entonces, ¿cómo puedo hacerlo para que el Dialog no sea cancelable?

parece extraño a intentar algo como:

@Override 
    public void onBackPressed() { 
     if(fragmentManager.fragmentManager.findFragmentByTag("progress dialog")!=null) { 

     } 
    } 
+0

Android parece estar diciendo que ProgressDialog no debe utilizarse más, que en lugar usted debe “utilizar un ProgressBar en su diseño.” Http://developer.android.com/ guía/temas/ui/dialogs.html. No dicen por qué, pero supongo que podría ser para evitar todo el desorden en el manejo de eventos inusuales después de la espera (llamadas al servidor fallidas, aplicación que regresa de la tarea en segundo plano, etc.). – Lucy

Respuesta

35

En lugar de ProgressDialog, ¿por qué no pruebas a setCancelable(false) en DialogFragment?

+1

¡Buen punto! Tan simple como 'public void setDialogStyle (DialogStyle dialogStyle) { this.setCancelable (dialogStyle == DialogStyle.CANCELABLE); } '(Estoy usando enum aquí) – LuxuryMode

+0

¡Piensa que funcionó, gracias! – mitchellt

10

Puede también utilizar setCancelable(false) en ProgressDialog

Cuestiones relacionadas