2011-09-07 5 views
17

Używam ProgressDialog zarządzanego jako Fragment. Nawet jeśli ustawię opcję ProgressDialog na nieodwracalną, przycisk BACK będzie nadal działał, aby usunąć Fragment ze stosu. Mój wewnętrzny klasa wyglądać następująco:Jak ustawić okno postępu, aby nie można było anulować, gdy jest zarządzane jako fragment?

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; 
    } 
} 

I wtedy metoda I narazić się:

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"); 
     } 

Więc oczywiste zamieszanie o to, że przycisk BACK usuwa ProgressDialog ponieważ jest zarządzany jako Fragment. Więc jak mogę to zrobić, aby Dialog nie można było anulować?

Wydaje się dziwne, aby spróbować czegoś takiego:

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

     } 
    } 
+0

Androida zdaje się mówić, że ProgressDialog nie powinien być stosowany już, że zamiast trzeba „użyć ProgressBar w układzie”. Http://developer.android.com/ guide/topics/ui/dialogs.html. Nie mówią dlaczego, ale przypuszczam, że może to być uniknięcie wszelkich problemów związanych z nietypowymi zdarzeniami po oczekiwaniu (nieudane połączenia z serwerem, aplikacja powracająca z zadania w tle itd.). – Lucy

Odpowiedz

35

Zamiast ProgressDialog, dlaczego nie spróbować setCancelable(false) na DialogFragment?

+1

Dobra uwaga! Tak proste jak 'public void setDialogStyle (DialogStyle dialogStyle) { this.setCancelable (dialogStyle == DialogStyle.CANCELABLE); } '(Używam tutaj enum) – LuxuryMode

+0

Pomyślę, dziękuję! – mitchellt