2013-02-11 13 views
13

Jest to funkcja odpowiedzialna za dodawanie fragmentów kopii stos:Android - addToBackStack() nie działa?

public void populateContent(File f) 
{ 

    ContentFragment cf = new ContentFragment(ctx, ac, this); 
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();; 
    cf.updateView(f); 

    transaction.replace(R.id.contentFragment, cf); 

    transaction.addToBackStack(null); 

    transaction.commit(); 

} 

Po kliknięciu przycisku Wstecz, ostatni fragment nie ładowane (nic się nie dzieje).

Każdy pomysł, co może być przyczyną?

Edytuj: Dziennik FragmentManager.

http://pastebin.com/mYnVdkLG

Wydaje mi się, że moja aplikacja jest oszczędność drugi pogląd dwukrotnie, zamiast ratować się pierwszy, a potem drugi pogląd.

+0

myślę, że należy addtobackStack(), a następnie zastąpić fragment ... – user1969053

+0

To go nie rozwiązało. – Tool

+0

Ta odpowiedź: http://stackoverflow.com/a/14030872/1484779 – jlopez

Odpowiedz

11

Nie jestem pewien co do rzeczywistego rozwiązania, ale mogę Cię poprowadzić i być może uda Ci się ustalić, na czym polega problem.

Czy faktycznie zastępujesz dwa fragmenty? Jeśli nie, to nie ma transakcji do odwrócenia. Czy Twój pierwszy Fragment został dodany z XML? Menedżer nie będzie wiedział o tym fragmencie i może zaistnieć konieczność dodania pierwszego Fragment również za pomocą transakcji.

Należy sprawdzić pod kątem if (savedInstanceState == null) performFirstTransaction(), w przeciwnym razie dwukrotnie zostanie dodane pierwsze Fragment.

Dobrym pomysłem jest użycie enableDebugLogging w FragmentManager. Dzięki temu dowiesz się, o których fragmentach wie kierownik.

Zobacz to: http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)

Na marginesie, nie jest zalecane, aby użyć niestandardowego konstruktora dla Fragment. Dzieje się tak, ponieważ jeśli twoja aplikacja zostanie zabita i ponownie utworzona przez system operacyjny, wywoła pusty konstruktor.

Należy użyć metody statycznej, takiej jak ContentFragment.getInstance(<params>), aby utworzyć swoją Fragment.

Zobacz więcej informacji pod adresem: http://developer.android.com/reference/android/app/Fragment.html w sekcji "Przegląd klasy".

Mam nadzieję, że moja odpowiedź pomoże ci trochę znaleźć problem.

+0

Mogę pokazać dzienniki FragmentManager, może oni ci pomogą. – Tool

+0

Ponadto, nie mam niestandardowego konstruktora dla mojego Fragmentu - nie zmieniłem go. Mam jednak metodę w Fragmentie, która służy jako narzędzie do aktualizacji widoku. – Tool

+0

OK, opublikowałem link dziennika od menedżera. – Tool

51

Wygląda na to, że wywołanie metody addToBackStack() przy transakcji fragmentów nie wystarczy, musimy poradzić sobie z pojawieniem się tylnego stosu po naciśnięciu przycisku Wstecz. Dodałem to do mojej działalności i działał zgodnie z oczekiwaniami:

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0){ 
     getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+3

To działa, ale nie odtwarza animacji. EDYCJA: Jeśli chcesz odtwarzać animację na popackstack, dodaj dwa dodatkowe parametry, gdy wywołasz setCustomAnimation. Zobacz [tutaj] (http://stackoverflow.com/questions/25485822/android-pop-fragment-from-backstack-with-animation). – Nathan

+2

To działa ładnie. To zaskakujące, że sami musimy sobie z tym poradzić, ponieważ, jak sądzę, dokumentacja mówi, że stanie się to automatycznie. – Ankit

+0

jeśli jest to dokumentowane w jakiś sposób? – Defuera

2

byłem dodając, nie zastąpienie, ale musiałem zadzwonić addToBackStack (null) przed add(), a nie po, na fragmencie, który zostanie zamknięty, nie na fragmencie, który pozostanie otwarty.

w klasie A (otwarty pierwszy)

FragmentTransaction ft = fm.beginTransaction(); 
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 

w klasie B (otwartego klasa A)

FragmentTransaction ft = fm.beginTransaction(); 
ft.addToBackStack(null); 
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 
+0

addToBackStack podczas wykonywania dodawania/zamiany fragmentu jest to, co zrobiłem dla mnie. – Clocker

+0

* "zadzwoń do addToBackStack (null) przed add(), nie po" * To jest dokładnie to, co było moim problemem. Uratowałeś mi mnóstwo bólu głowy. Dzięki! –