2013-01-05 12 views
6

Qualcuno può dare un'occhiata se sto facendo correttamente quanto segue. Ho un frammento che ha un progressdialog e ho bisogno che funzioni attraverso un interruttore di orientamento. Io attualmente faccio in questo modo:ProgressDialog (Frammento) che funziona attraverso un interruttore di orientamento

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

nella mia attività ho creare questa ProgressDialogFragment e mi chiamano show() quando ho bisogno la finestra di dialogo per mostrare. Sto cercando di capire perché nel metodo onCreateDialog non posso semplicemente restituire mProgressDialog se esiste già (ricevo un'eccezione dicendo "requestFeature() deve essere chiamato prima di aggiungere il contenuto"). Sicuramente uno degli usi dei frammenti è riutilizzare le risorse in questi casi: perché devo creare una nuova finestra di dialogo invece di usare quella che è già presente?

risposta

2

Non è possibile passare semplicemente la vecchia finestra di dialogo nel metodo onCreateDialog perché ha un riferimento al vecchio contesto, ovvero l'attività che viene distrutta.

Se non si ricrea la finestra di dialogo, si verificherà una perdita di memoria.

+0

Il metodo onCreate non viene chiamato su un interruttore di orientamento: il frammento non viene distrutto e quindi ricreato. – Lieuwe

+0

Mi spiace intendevo il metodo onCreateDialog che verrà chiamato di nuovo. –

+0

Stai provando a salvare l'avanzamento tra le modifiche all'orientamento? –

Problemi correlati