2012-12-26 4 views
7

io assolutamente d'accordo con la navigazione sottoIl modo corretto di gestire "Up" di navigazione secondo le direttive

enter image description here

Immaginate che dettaglio libro è fatto in diverse istanze di una BookDetailActivity.

Lo stack prima di premere fino in dettaglio book2 è:

  • BookDetailActivity (Libro 2 - Vi trovate qui)
  • BookDetailActivity (Book 1)
  • AllBooksActivity

Se seguo il guidelines Userò:

Ma il grosso problema con questo codice è che BookDetailActivity (Book 1) è ancora vivo!

Premendo di nuovo il tasto dopo "up" porterebbe dettaglio di Book 1.

Come posso uccidere tutti i BookDetailActivity che sono tra l'originale AllBooksActivity e l'attività in cui ho premuto su?

+0

hai considerato l'utilizzo di frammenti anziché attività? –

+0

Ho bisogno di un'attività diversa perché voglio l'animazione (se abilitata sul dispositivo dell'utente) per creare una nuova "Finestra" e transizioni tra interi schermi –

+0

per quanto ne so, è possibile avere transizioni tra i frammenti: http: // developer. android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int) –

risposta

5

Il related guidelines article osserva quanto segue:

Attuazione Nota: Per una protezione ottimale, in sede di attuazione sia casa o verso l'alto, assicurarsi di cancellare il pila posteriore di qualsiasi schermo discendente. Per la casa, l'unica schermata rimanente nello stack posteriore dovrebbe essere la schermata iniziale . Per la navigazione Su, la schermata corrente deve essere rimossa dallo stack posteriore, a meno che Back non navighi attraverso le gerarchie dello schermo. È possibile utilizzare i flag di intento FLAG_ACTIVITY_CLEAR_TOP e FLAG_ACTIVITY_NEW_TASK per ottenere ciò.

Dato che lo stai facendo, BookDetailActivity1 deve essere chiuso da FLAG_ACTIVITY_CLEAR_TOP.L'unico modo se può essere vivo e mostrato premendo Indietro è se sarebbe stato avviato prima di AllBooksActivity.

Come per non aver bisogno FLAG_ACTIVITY_NEW_TASK (suggerito da sviluppatore Android 's risposta):

Quando si utilizza questo flag, se un'attività è già in esecuzione per l'attività si sta ora iniziando, quindi un nuovo l'attività non verrà avviata; invece, l'attività corrente sarà semplicemente essere portato verso la parte anteriore dello schermo con lo stato in cui era ultima in.

... quindi se esiste la vostra attività, non sarà iniziare una nuova attività.

+0

Per quanto riguarda il nuovo flag di attività, il tuo commento potrebbe essere vero ma perché aggiungere la flag in primo luogo? Non mi sembra un nuovo compito. – kabuko

+0

Potrebbe non essere necessario in tutti i casi. Ma se gli utenti possono lanciare BookDetailsActivity dall'esterno dell'app (da una notifica, scansionando un codice ecc.), Ha senso. Guarda l'ultimo esempio (Navigazione tra le app per supportare la condivisione) in questo articolo: http://developer.android.com/design/patterns/navigation.html –

1

ok, ci sono diversi modi per fare una cosa del genere. eccone uno:

tuttavia, suggerirei che invece di aprire la prima attività come se fosse una nuova, semplicemente finisca quella attuale e quella precedente.

per fare ciò, chiamare ogni nuova attività con startActivityForResult e impostare il risultato per ciascuna attività su un valore che indica che si desidera tornare alla prima attività.

puoi anche impostare il valore come nome canonico di classe e creare un'attività di base che gestirà tutte quelle richieste automaticamente in modo da non doverla gestire.

in ogni caso, penso che tu abbia commesso un errore utilizzando Intent.FLAG_ACTIVITY_NEW_TASK poiché crea una nuova attività, quindi la precedente esiste ancora. provare a leggere le intenzioni flag disponibili per ulteriori informazioni: http://developer.android.com/reference/android/content/Intent.html

+0

+1 per non aver bisogno di 'FLAG_ACTIVITY_NEW_TASK' – Geobits

+0

quindi ora funziona correttamente? –

+0

Sembra che il blog di deverloper non sia accurato: http://developer.android.com/training/implementing-navigation/ancestral.html –

Problemi correlati