2012-12-20 19 views
12
private static void changeFragment(Fragment f, boolean init) { 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.replace(R.id.info_content, f,f.getClass().getName()); 
     if(!init){ 
      ft.addToBackStack(null); 
     } 
     ft.commit(); 
    } 

kiedy chcę uzyskać cout stosu przez wywołanie fm.getBackStackEntryCount(), zwraca zero?Dlaczego funkcja getBackStackEntryCount() obiektu FragmentManager zwraca zero?

+0

jaka jest wartość bool init? – Arvis

+0

niezależnie od wartości true lub false, zawsze wynosi zero. – beiliubei

Odpowiedz

27

Musisz zadzwonić pod numer fm.executePendingTransactions() po ft.commit() lub przed fm.getBackStackEntryCount(). Ponieważ commit() tylko planuje transakcje na późniejszy przebieg.

+3

Wiem, że ta odpowiedź pochodzi sprzed 2 lat, ale mam podobne problemy i wywołanie 'getSupportFragmentManager(). ExecutePendingTransactions();' po zatwierdzeniu nie udało się rozwiązać problemu. Czy możesz zaproponować jakieś inne zmiany? –

+0

Po wywołaniu metody executePendingTransactions() po zatwierdzeniu() zostaje zgłoszony wyjątek. Jeśli zostanie wywołane przed getBackStackEntryCount(), to liczba ta nadal wynosi zero. –

5

Może być zbyt późno, aby odpowiedzieć na to pytanie. Mam nadzieję, że ta odpowiedź i tak pomoże komuś.

Głównie zależy to od miejsca, w którym faktycznie wywoływana jest metoda getBackStackEntryCount(). W moim przypadku wywoływałam tę metodę po wywołaniu super.onBackPressed(). W momencie, w którym została wywołana ta metoda, w tylnym stosie nie było fragmentu. Dlatego ja zawsze odbiera 0.

właściwy sposób wywołania metody w onBackPressed():

@Override 
public void onBackPressed() { 
    try { 
     int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount(); 
     Log.d("class", "items in backstack " + backStackEntryCount); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    super.onBackPressed(); 
} 
+0

To rozwiązało mój problem, dziękuję! – Ethan

2

Innym rozwiązaniem jest użycie FragmentManager.OnBackStackChangedListener

fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Log.d("test", "backStackEntryCount: " + fm.getBackStackEntryCount()); 
     } 
}); 
17

miałem podobny problem, w moim case getFragmentManager(). Funkcja getBackStackEntryCount() zawsze zwracała zero.

Mój problem był ja stosując fragmenty wsparcia:

Fragment fragment = new MyFragment(); 
// note getSupportFragmentManager() instead getFragmentManager() 
FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction() 
.replace(R.id.frame, fragment) 
.addToBackStack(null) 
.commit(); 

fragmentManager.executePendingTransactions(); 

a ja sprawdzając getFragmentManager() backStackEntryCount, który zawsze zwraca zero (nie jest to za pomocą innego menedżera fragment):

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

zamiast getSupportFragmentManager, który zwraca prawidłową liczbę:

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getSupportFragmentManager().popBackStack();   
    } 
} 

Mam nadzieję, że pomoże!

+2

Omg, to takie potencjalne źródło błędów dla wszystkich programistów. Dzięki. –

1

Być może jest za późno, aby odpowiedzieć na to pytanie. Mam nadzieję, że ta odpowiedź i tak pomoże komuś.

Powinieneś pobrać metodęBackStackEntryCount() w onResume().

To będzie tak:

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.i(TAG, "onResume: " + fragmentManager.getBackStackEntryCount()); 
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) { 
     Log.i(TAG, "Found fragment: " + fragmentManager.getBackStackEntryAt(entry).getId()); 
    } 
} 

Powodzenia!

Powiązane problemy