2014-04-12 10 views
9

Muszę zaimplementować system nawigacji podobny do tego używanego w kliencie Instagram dla systemu Android.Wdrażanie Instagrama jak system nawigacji w aplikacji na Androidzie

  1. Przez cały czas powinien być stały pasek zakładek u dołu ekranu.
  2. Gdy użytkownik przechodzi głębiej w obrębie jednej z tych kart, pozwala wyświetlić widok szczegółów, a następnie przechodzi do innej karty, a następnie przełącza się z powrotem na poprzednią kartę, należy wyświetlić ostatni pokazany (głębszy) widok szczegółów i naciśnij ponownie, powinno ono być powtarzane aż do głównego widoku wspomnianej zakładki.

Co ja wymyślił tak daleko jest następujące:

  • Mam MainAcitvity przedstawiający menu na dole.
  • Po wybraniu punktu menu pojawi się fragment Fragment.
  • Gdy użytkownik przejdzie dalej w obrębie Fragmentu, prosi Aktywność Główną o zmianę jego zawartości według podanych kryteriów, co powoduje zmianę pokazanego fragmentu.
  • Dodaję wszystkie zmiany Fragmentu do backStack, wywołując metodę addToBackStack() FragmentTransaction.

siedzę w tym momencie i nie można dowiedzieć się, jak włączyć fragmenty na prasach z powrotem, i jak radzić sobie nawigacje zakładki gdy głębsze poglądy są pokazane zamiast główne widoki na kartach.

Mam na myśli wykorzystanie własnych oddzielnych "implementacji backstack" dla każdej zakładki. Gdy użytkownik nawiguje głębiej w obrębie karty, generuję unikalny "tag" i używam tego tagu podczas wywoływania metody addToBackStack(), a także umieszczania tagu w "backStack" zaimplementowanym przeze mnie. Jeśli użytkownik przejdzie ponownie do tej zakładki, mogę sprawdzić, czy mam jakieś znaczniki w "backStack" dla tej karty, a jeśli tak, to wyszukaj ten wpis w prawdziwym backStack w module fragmentManager MainActivity i przełącz na to.

Nie mogłem wymyślić nic lepszego. Czy istnieje jakiś lepszy/prostszy sposób na zachowanie tego zachowania? Czy coś mi brakuje? (Wiem, że to naprawdę zły projekt aplikacji w świecie Androida, ale jest to kolejne pytanie)

+0

Jestem w tej samej sytuacji, mój przyjacielu, jeśli będziesz wiedział, jak to zrobić, to bardzo bym chciał, żebyś to opublikował i powiedział mi proszę, dzięki – Hugo

+0

@ Hugo Przekazałem moje doświadczenia jako odpowiedź. Zarzuty daj mi znać, jeśli uznasz to za pomocne. –

Odpowiedz

5

Zamieszczam odpowiedź, ponieważ pytanie jest dość martwe, ale wniosek może być pomocny dla innych.

Skończyło się na trzymaniu starego wzoru NavgationDrawer, który działał dobrze. Ale w międzyczasie musiałem wdrożyć projekt biblioteczny, który dostarczył Fragment do aplikacji hostingowej, która miała swoją własną logikę. Fragment następnie użył swojego ChildFragmentManagera, aby dodać do niego kolejne Fragmenty. Program ChildFragmentManager jest przeniesiony do biblioteki Android Support v4, dzięki czemu można go używać w zasadzie wszędzie.

Więc powiedzmy, że chcesz x Punkty menu, w których możesz nawigować głębiej. Będą to Fragmenty używające swoich ChildFragmentManagers do dodawania innych Fragmentów do nawigacji w głąb tego Menu. ChildFragmentManagers mają swój własny back-stack, więc nie musisz się martwić o obsługę stanów. Jeśli wybierzesz inne menu, możesz wyszukać odpowiedni fragment w MainActivitys FragmentManager i wrócić do niego lub dodać go, jeśli jeszcze nie został dodany.

Uważaj, musisz samodzielnie zaimplementować funkcję wycofania, ponieważ program ChildFragmentManagers nie otrzyma automatycznie zdarzenia backPressed. Możesz to zrobić, obsługując zdarzenie onBackPressed w MainActivity.

@Override 
public void onBackPressed() { 
    boolean handled = false; 
    if(getFragmentManager().getBackStackEntryCount() == 0){ 
    // No menu added 
    return super.onBackPressed(); 
    } 

    Fragment frag = getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount() - 1); 

    if (frag instanceof XMenuFragment && frag.isVisible()) { 
    FragmentManager childFm = frag.getChildFragmentManager(); 
    if (childFm.getBackStackEntryCount() > 0) { 
     // pop the last menu sub-Fragment 
     childFm.popBackStack(); 
     handled = true 
    } 
    } 

    if(!handled){ 
    super.onBackPressed(); 
    } 
} 

Użyłem innego kodu, więc może on zawierać błędy, ale mam nadzieję, że koncepcja jest jasna.

+0

świetny @Csaba Szugyiczki, jest to ciekawy sposób na rozwiązanie problemu, dam mu spróbować w najbliższych dniach i powiem wam moje wyniki, dziękuję bardzo! – Hugo

+0

@ Hugo Czy to się udało? –

+0

teraz jestem w trakcie implementacji, ale na razie rozwiązanie z fragmentami działa idealnie. @Ssaba Szugyiczki to nie to samo co twoje, ale jest podobnie. Wezwę rozwiązanie z niektórymi kodami, kiedy skończy się ok? (prawdopodobnie w przyszłym tygodniu) – Hugo

Powiązane problemy