2013-01-05 11 views
6

Czy ktoś może sprawdzić, czy robię następujące poprawnie. Mam fragment, który ma progressdialog i potrzebuję go do pracy poprzez przełącznik orientacji. I obecnie to zrobić tak:ProgressDialog (fragment), który działa przez przełącznik orientacji

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

W mojej działalności tworzę ten ProgressDialogFragment i wzywam show(), kiedy muszę okno do pokazania. Próbuję zrozumieć, dlaczego w metody onCreateDialog nie mogę po prostu zwrócić mProgressDialog, jeśli już istnieje (otrzymuję wyjątek mówiąc, że "requestFeature() musi być wywołana przed dodaniem treści"). Z pewnością jednym z zastosowań fragmentów jest ponowne wykorzystanie zasobów w tych przypadkach - dlaczego muszę utworzyć nowe okno dialogowe zamiast używać tego, które już istnieje?

Odpowiedz

2

Nie można po prostu przekazać starego okna dialogowego w metodzie onCreateDialog, ponieważ ma ono odniesienie do starego kontekstu, tj. Działania, które jest niszczone.

Jeśli nie utworzysz ponownie okna dialogowego, skończy się to wyciekiem pamięci.

+0

Metoda onCreate nie jest wywoływana w przełączniku orientacji - fragment nie jest niszczony, a następnie odtwarzany. – Lieuwe

+0

Przepraszam, chodzi mi o metodę onCreateDialog, która będzie ponownie wywoływana. –

+0

Czy próbujesz zapisać postęp między zmianami orientacji? –

Powiązane problemy