2013-01-05 6 views
6

Kann jemand schauen, wenn ich folgendes richtig mache. Ich habe ein Fragment, das einen Fortschrittdialog hat und ich brauche es über einen Orientierungsschalter zu arbeiten. Ich tue dies derzeit etwa so:ProgressDialog (Fragment), das über einen Orientierungsschalter funktioniert

// I am using the compat libraries 
import android.support.v4.app.DialogFragment; 

public class ProgressDialogFragment extends DialogFragment { 

    private ProgressDialog mProgressDialog = null; 
    private int   mMax   = 100; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setStyle(DialogFragment.STYLE_NO_TITLE, 0); 
     setRetainInstance(true); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     mProgressDialog = new ProgressDialog(getActivity()); 
     mProgressDialog.setTitle("Title"); 
     mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     mProgressDialog.setCancelable(true); 
     mProgressDialog.setProgress(0); 
     mProgressDialog.setMax(mMax); 
     mProgressDialog.setCanceledOnTouchOutside(false); 

     return mProgressDialog; 
    } 

    // there seems to be a bug in the compat library - if I don't do the following - the dialog is not show after an orientation switch 
    @Override 
    public void onDestroyView() { 
     if (getDialog() != null && getRetainInstance()) 
      getDialog().setDismissMessage(null); 
     super.onDestroyView(); 
    } 

    public void setMax(int arg1) { 
     mProgressDialog.setMax(arg1); 
     mMax = arg1; 
    } 

    public void setProgress(int arg1) { 
     mProgressDialog.setProgress(arg1); 
    } 
} 

In meiner Tätigkeit Ich schaffe diese ProgressDialogFragment und ich rufe show(), wenn ich den Dialog müssen zeigen. Ich versuche zu verstehen, warum in der onCreateDialog-Methode ich nicht einfach den mProgressDialog zurückgeben kann, wenn es bereits existiert (ich bekomme eine Ausnahme, die sagt "requestFeature() muss vor dem Hinzufügen von Inhalt aufgerufen werden"). Sicher ist eine der Verwendungen von Fragmenten die Wiederverwendung von Ressourcen in diesen Fällen - warum muss ich einen neuen Dialog erstellen, anstatt den bereits vorhandenen zu verwenden?

Antwort

2

Sie können den alten Dialog nicht einfach in der onCreateDialog-Methode übergeben, da er einen Verweis auf den alten Kontext hat, dh die Aktivität, die zerstört wird.

Wenn Sie den Dialog nicht neu erstellen, wird am Ende ein Speicherverlust auftreten.

+0

Die onCreate-Methode wird nicht auf einem Orientierungsschalter aufgerufen - das Fragment wird nicht zerstört und dann neu erstellt. – Lieuwe

+0

Entschuldigung, ich meinte die onCreateDialog-Methode, die erneut aufgerufen wird. –

+0

Versuchen Sie, den Fortschritt zwischen den Orientierungsänderungen zu speichern? –