2012-12-26 9 views
7

ja całkowicie zgadzam się z nawigacji poniżejWłaściwym sposobem obsługi „Up” Nawigacja według wytycznych

enter image description here

Wyobraźmy sobie, że detal Książka jest wykonany w różnych wystąpień BookDetailActivity.

Stos przed wciśnięciem się w Book2 szczegóły jest:

  • BookDetailActivity (Book 2 - Jesteś tutaj)
  • BookDetailActivity (Book 1)
  • AllBooksActivity

Jeśli śledzę guidelines Użyję:

Ale dużym problemem z tym kodem jest to, że BookDetailActivity (Book 1) wciąż żyje!

Naciśnięcie przycisku z powrotem po „w górę” przyniesie szczegół Księdze 1.

Jak mogę zabić wszystkich BookDetailActivity że są między pierwotnym AllBooksActivity i aktywności, gdzie wciśnięty w górę?

+0

Czy rozważałeś użycie fragmentów zamiast działań? –

+0

Potrzebuję innej aktywności, ponieważ chcę animacji (jeśli jest włączona na urządzeniu użytkownika), aby utworzyć nowe "okno" i przejścia między całymi ekranami –

+0

o ile wiem, możesz mieć przejścia między fragmentami: http: // programista. android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int) –

Odpowiedz

5

related guidelines article zauważa następujący:

realizacji Uwaga: Jako najlepszych praktyk, przy wdrażaniu albo Home lub w górę, upewnij się, aby wyczyścić tylny stos wszystkich kolejnych ekranów. Dla domu jedynym pozostałym ekranem na tylnym stosie powinien być ekran główny . W przypadku nawigacji w górę bieżący ekran należy usunąć z tylnego stosu, chyba że opcja Wstecz umożliwia nawigację między hierarchiami ekranów. Możesz użyć fladze FLAG_ACTIVITY_CLEAR_TOP i FLAG_ACTIVITY_NEW_TASK , aby to osiągnąć.

Ponieważ to robisz, BookDetailActivity1 powinien zostać zamknięty przez FLAG_ACTIVITY_CLEAR_TOP.Jedyny sposób, aby mógł być żywy i pokazany po naciśnięciu klawisza Back, byłby uruchomiony przed AllBooksActivity.

Jak dla nie wymagających FLAG_ACTIVITY_NEW_TASK (sugerowane przez android dewelopera „s odpowiedź):

Przy użyciu tej flagi, jeśli zadanie jest już uruchomiony za aktywność jesteś teraz zaczynając, a następnie nowy aktywność nie zostanie uruchomiona; zamiast obecny zadaniem będzie po prostu być doprowadzone do przedniej części ekranu ze stanu, w jakim był ostatni w.

... więc jeśli aktywność istnieje, to nie uruchomi nowe zadanie.

+0

Jeśli chodzi o flagę nowego zadania, Twój komentarz może być prawdziwy, ale dlaczego warto dodać tę flagę? Nie wydaje mi się to nowym zadaniem. – kabuko

+0

Może nie być potrzebna we wszystkich przypadkach. Ale jeśli użytkownicy mogą uruchomić usługę BookDetailsActivity spoza aplikacji (z powiadomienia, skanując kod itp.), Ma to sens. Zobacz ostatni przykład (Poruszanie się między aplikacjami, aby wspomóc udostępnianie) w tym artykule: http://developer.android.com/design/patterns/navigation.html –

1

OK, istnieje wiele sposobów na zrobienie czegoś takiego. oto jeden z nich:

sugeruję jednak, że zamiast otwierać pierwszą czynność tak, jakby była nowa, wystarczy zakończyć bieżącą i poprzednią.

Aby to zrobić, wywołaj każdą nową aktywność za pomocą funkcji startActivityForResult i ustaw dla każdej z działań wartość, która mówi, że chcesz powrócić do pierwszego działania.

można nawet ustawić wartość na kanoniczną nazwę klasy i utworzyć działanie podstawowe, które obsłuży wszystkie te żądania automatycznie, tak aby użytkownik nie musiał ich obsługiwać.

w każdym przypadku, myślę, że popełniłeś błąd za pomocą Intent.FLAG_ACTIVITY_NEW_TASK, ponieważ tworzy on nowe zadanie, więc poprzednie nadal istnieje. spróbuj przeczytać dostępnych flag zamiarów, aby uzyskać więcej informacji: http://developer.android.com/reference/android/content/Intent.html

+0

+1, ponieważ nie potrzebuje 'FLAG_ACTIVITY_NEW_TASK' – Geobits

+0

, więc teraz działa poprawnie? –

+0

Wygląda na to, że blog deverloper nie jest dokładny: http://developer.android.com/training/implementing-navigation/ancestral.html –