2015-04-28 11 views
7

È abbastanza comune per la mia app mostrare un progresso o AlertDialog per l'utente. Se l'utente mette l'app in background e poi ritorna in un secondo momento, voglio che lo Dialog sia ancora mostrato. C'è un modo per farlo funzionare su Android? Mi piacerebbe che non si chiudesse la finestra di dialogo, o se lo riapri automaticamente quando riprende lo Activity.Previene la finestra di dialogo (o DialogFragment) dalla chiusura quando l'app passa allo sfondo

Finora sembra niente. Non ho trovato un sacco di risultati su questo (la maggior parte delle persone si imbatte in problemi con cambiamenti di orientamento, cosa che la mia app non consente) ma pochissimi chiedono di andare in secondo piano. Ho provato ogni permutazione di DialogFragment e regolare Dialog, ma scompaiono tutti quando viene premuto il pulsante Home e l'app viene aperta dal task manager.

Non ho nemmeno alcun codice da mostrare perché è tutto nella fase di test di vari esempi online. Sospetto che dovrò farlo da solo, controllando in onResume( se qualcosa dovrebbe essere mostrato. Se questo è il caso, posso conviverci, ma mi piacerebbe saperlo con certezza.

+0

hai provato con metodo: onSaveInstanceState? e ripristinarlo in OnCreate? – MiguelHincapieC

+0

Posso darti uno snippet di codice di una mia app che fa ciò che stai cercando (usando il metodo onSaveInstanceState), dovrei postarlo? – MiguelHincapieC

+0

Invia il tuo codice. –

risposta

3

Prima consente di cancellare qualcosa, come si può vedere nelle immagini successive, la tua attività o il frammento può essere distrutto per molte ragioni, quindi devi fare i conti con quello che vuoi salvare "lo stato del tuo dialogo".

activity life cycle enter image description here

Ora il codice:

public class CustomProgressDialog extends Dialog { 

    private static final String SHOWING_PROGRESS_DIALOG = "showing_progress_dialog"; 
    private static final String STRING_PROGRESS_DIALOG = "string_progress_dialog"; 
    private static final String SHOWING_POP_UP_DIALOG = "showing_pop_up_dialog"; 
    private static final String STRING_POP_UP_DIALOG = "string_pop_up_dialog"; 

    public TextView textView; 

    public CustomProgressDialog(Context context) { 
     super(context, android.R.style.Theme_Translucent_NoTitleBar); 

     setContentView(R.layout.progress_layout); 

     setCancelable(false); 

     textView = (TextView) findViewById(R.id.progress_textView); 
    } 

} 


public class MasterActivity extends FragmentActivity { 
    private CustomProgressDialog progressDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_master); 

     progressDialog = new CustomProgressDialog(this); 

     if (savedInstanceState != null) { 
      boolean showingDialog = savedInstanceState.getBoolean(SHOWING_PROGRESS_DIALOG); 
      if (showingDialog) { 
       String msg = savedInstanceState.getString(STRING_PROGRESS_DIALOG, getResources().getString(R.string.progress_default_text)); 
       progressDialog.textView.setText(msg); 
       progressDialog.show(); 
      } 

      boolean mShowing_PopUpdialog = savedInstanceState.getBoolean(SHOWING_POP_UP_DIALOG); 
      String temp_msg = savedInstanceState.getString(STRING_POP_UP_DIALOG, ""); 

      if (mShowing_PopUpdialog) 
       showPopUpDialog(temp_msg); 
      } 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     if (progressDialog.isShowing()) { 
      outState.putBoolean(SHOWING_PROGRESS_DIALOG, true); 
      outState.putString(STRING_PROGRESS_DIALOG, progressDialog.textView.getText().toString()); 
     } 

     if (alert != null && alert.isShowing()) { 
      outState.putBoolean(SHOWING_POP_UP_DIALOG, true); 
      outState.putString(STRING_POP_UP_DIALOG, mString_dialog); 
     } 
    } 
} 
+0

Nel codice sopra mi occupo anche di un popup, indovina puoi cancellare solo le righe a riguardo – MiguelHincapieC

+1

Un'altra cosa che dovresti fare attenzione è lanciare comportamenti mentre la tua app è in background (un ritorno da un asyncTask che mostra una finestra di dialogo, mostra un altro frammento/attività, ecc.), se è necessario dimmi semplicemente – MiguelHincapieC

+0

Grazie! Ora sto usando qualcosa di simile a questo. –

0

Prova questa nelle vostre DialogFragment 's onPause() fare questo

@Override 
public void onPause() { 
super.onPause(); 
getActivity().getSupportFragmentManager().beginTransaction() 
       .addToBackStack("mydialogfragment").commit(); 
Log.v("dialog", "dialog is going down"); 
} 

Poi, nel tuo Activity' s onResume() voi chiamare il DialogFragment in vita

@Override 
protected void onResume() { 
    super.onResume(); 
    getSupportFragmentManager().popBackStack(); 
    Log.v("activity", "onresume called - i am bringing back the dialog"); 
} 

Perché penso che questo potrebbe funzionare è un DialogFragment è un Fragment, e un ciclo di vita Fragment s' è controllata dalla capogruppo Activity come utente @ 0mach0 diagramma mostra, quindi tutto quello che fai è lo spingi a fare il backstack e richiamalo. quindi dovrebbe funzionare