2012-10-24 20 views
5

Ho un'attività e ho bisogno di mostrare la finestra di dialogo al suo interno. Tutto funziona bene qui. Ho overrided onCreateDialog metodo in attività, ecco il codice:La finestra di dialogo Android viene visualizzata di nuovo dopo che l'attività viene ricreata

Dove CreateWaitDialog è metodo personalizzato di creare un dialogo e waitDialog è statica variabile.

che sto mostrando dialogo chiamando showDialog (10)

Tutto il codice è in esecuzione bene.

Dopo che la finestra di dialogo è stata mostrata, la sto chiudendo chiamando.

if(waitDialog != null) 
    waitDialog.hide(); 

E lo sto ignorando quando l'attività viene distrutta.

if(dialogCreated) 
     dismissDialog(10); 
    super.onDestroy(); 

Si sta chiudendo e tutto è perfetto. MA, quando cambio l'orientamento del mio dispositivo e l'attività viene ricreata, si apre di nuovo da solo! Non sto chiamando nessun showDialog o qualcosa del genere che sta spuntando!

risposta

8

Credo che questo sia definito il comportamento della attività e onCreateDialog:

richiamata per la creazione di finestre di dialogo che sono gestiti (salvati e ripristinati) per voi dall'attività. L'implementazione predefinita richiama a onCreateDialog (int) per la compatibilità. Se scegli come target HONEYCOMB o successivo, considera invece l'utilizzo di un DialogFragment.

Se si utilizza showDialog (int), l'attività eseguirà la chiamata a questo metodo la prima volta e ci si aggrapperà successivamente. Qualsiasi finestra di dialogo creata con questo metodo verrà automaticamente salvata e ripristinata per te, incluso se viene mostrata.

Se si desidera che l'attività gestisca il salvataggio e il ripristino delle finestre di dialogo, è necessario sovrascrivere questo metodo e gestire qualsiasi ID passato a showDialog (int).

Immagino che onDestroy sia troppo tardi nel ciclo di vita delle attività per chiudere la finestra di dialogo. La mia ipotesi è che l'attività stia salvando la finestra di dialogo all'interno di onSaveInstanceState.

Potrei provare a chiudere la finestra di dialogo all'interno di onSaveInstanceState prima di chiamare super.onSaveInstanceState, quindi la finestra di dialogo verrà chiusa prima che Android tenti di salvarlo e ripristinarlo.

@Override 
onSaveInstanceState(Bundle outstate) { 

    dismissDialog(10); 
    super.onSaveInstanceState(outstate); 
} 
+1

Detesto le risposte in competizione da quando hai preso il tempo extra per citare la documentazione, ho rimosso la mia risposta e ti ho dato un upvot. – Sam

+0

@Sam Penso che la tua risposta abbia ancora valore, vorrei lasciarla.Probabilmente dovrebbe chiamare il licenziamento invece di nascondere, la mia risposta è semplicemente un tentativo/trucco per aggirare il comportamento predefinito di onCreateDialog. Penso che la tua sia probabilmente la soluzione migliore. – Tim

+0

Ho appena controllato il codice sorgente e se la finestra di dialogo è visualizzata ripetutamente, usare 'hide()' è un approccio più veloce. Anche la tua risposta potrebbe essere stata una supposizione, ma è ben fondata e corretta. Quindi sono felice di lasciare il mio upvote. – Sam

1

Chiama Activity.removeDialog (int id) se si desidera impedire all'app di continuare a salvare e ripristinare la finestra di dialogo.

4

Mi sono trovato con un problema simile che si è verificato perché ho overrode suDismiss() senza chiamare super.onDismiss(). Se ti ritrovi con finestre di dialogo che riappaiono quando viene ricreata un'attività, potresti verificare di non aver commesso lo stesso errore.

Problemi correlati