2012-08-04 18 views
7

W mojej głównej działalności mam pasek akcji z NAVIGATION_MODE_TABS. Zawartość każdej karty to element listowy.Transakcje fragmentów, pasek działań i backstack

Chciałbym, aby po kliknięciu listit pojawił się nowy fragment, a tryb paska akcji został zmieniony na NAVIGATION_MODE_STANDARD (tak, że karty są teraz ukryte).

udało mi się uzyskać to do pracy z następującego kodu:

W metodzie listitemclick:

 ActionBar actionBar = getActivity().getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 

     Fragment albumListFragment = new AlbumListFragment(); 
     albumListFragment.setArguments(bundle); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 

     ft.replace(android.R.id.content, albumListFragment); 
     ft.addToBackStack(null); 

     // Commit the transaction 
     ft.commit(); 

     Log.i("FragmentList", "Item clicked: " + id); 

Problem jest po naciśnięciu przycisku Wstecz, wypustki są nadal ma, poprzedni fragment nie powraca do widoku.

Czy robię coś nie tak ... Czy to ma coś wspólnego z fragmentem backstack? Czy powinienem zrobić to inaczej, czy nawet pominąć backpress?

--Edit--

Dla jasności - Wołam addToBackStack gdy zgłoszę fragmenttransaction.replace, ale po naciśnięciu przycisku Wstecz, poprzedni fragment nie zostanie przywrócony.

+0

Sprawdź ten link raz http://www.vogella.com/articles/Android/article.html#fragments_tutorial – shassss

+0

Dzięki, ale nie jest to szczególnie pomocne w tym pytaniu .. –

+0

Korzystanie z addToBackStack jest tym, czego potrzebujesz. http://developer.android.com/guide/components/fragments.html#Transactions – Frohnzie

Odpowiedz

-1

Backstack kończy bieżącą aktywność i przechodzi do poprzedniej aktywności, a nie do poprzedniego fragmentu. (Patrz przewodnik po backstacku: http://developer.android.com/guide/components/tasks-and-back-stack.html).

Można wymusić, jak sugerowałeś, zachowanie poprzez nadpisanie funkcji BackPressed, jednak nie wiem, czy w ten sposób zmieniłem naturalne zachowanie Androida. Jeśli spojrzysz na inne aplikacje, w szczególności aplikacje podstawowe, które wykonują podobne czynności, przycisk Wstecz nie przechodzi do poprzedniego fragmentu, ale poprzedniej czynności.

Masz również całkowitą kontrolę nad zachowaniem przycisku "w górę" (to jest ikona Twojej aplikacji na pasku akcji za pomocą lewej strzałki). Musisz zaprogramować go tak, aby był używany jako przycisk opisany w przewodniku ActionBar (daj mi znać, jeśli musisz wiedzieć, jak to zrobić) i dzięki temu możesz ustawić poprzedni fragment na stosie, który utrzymywać gdzieś.

+0

Z dokumentów: Zanim jednak wywołasz metodę commit(), możesz wywołać metodę addToBackStack(), aby dodać transakcję do tylnego stosu transakcji fragmentów. Ten stos powrotny jest zarządzany przez działanie i pozwala użytkownikowi powrócić do poprzedniego stanu fragmentu, naciskając przycisk Wstecz. – Frohnzie

+0

@Frohnzie dziękuję za to, ale problem polega na tym, że używam addToBAckStack() i nie przywracam poprzedniego fragmentu, gdy naciskam ponownie. –

+0

@rascuache Kod wygląda poprawnie. Zrobiłem dokładnie to samo. Nie jestem pewien, co to jest. Używanie addToBackStack jest słuszne. Może możesz dodać więcej kodu. – Frohnzie

0

Doświadczyłem dokładnie tego samego problemu i zorientowałem się, że problem występuje tylko po ustawieniu paska akcji z powrotem na NAVIGATION_MODE_STANDARD.

Jedynym rozwiązaniem dla mnie było umieszczenie nowego fragmentu bez kart w działaniu pomocnika, który ma NAVIGATION_MODE_STANDARD. Następnie możesz łatwo korzystać z funkcji przycisku Wstecz oferowanej przez Androida, aby powrócić do aktywności w NAVIGATION_MODE_TABS i zachować jej stan.

1
Może trochę się spóźniłem, próbowałem odbudować twój problem godzinami, ale nie udało się. Próbowałem zmienić widok listy w części obsługiwanej przez kartę ActionBar na inny widok w sposób opisany w pytaniu (np. Ft.replace (android.R.id.content, albumListFragment);) bez efektu. Po pewnym Google i Stackoverflow, używam this way, aby pomyślnie przełączyć fragment w karcie, ale bez problemu, jak masz.

Jako „pasku akcji nie jest wyświetlana prawidłowo” problem, jego prawdopodobnie spowodowane przez revert backstack i zmiany UI jak opisują w android developer guide. możesz spróbować zastąpić wywołanie zwrotne onBackStackChanged() i ponownie skonstruować interfejs użytkownika.

Jako że problem "Backstack nie przywraca poprzedniego fragmentu", możesz opublikować nieco więcej kodu, aby pomóc innym w ponownym skonstruowaniu problemu, aby znaleźć odpowiedź.

Życzenie pomocne.

Powiązane problemy