2012-12-20 166 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(); 
    } 

當我想通過調用fm.getBackStackEntryCount()來獲取堆棧cout時,它會返回零嗎?爲什麼FragmentManager的getBackStackEntryCount()返回零?

+0

bool init的值是什麼? – Arvis

+0

無論真假,它始終爲零。 – beiliubei

回答

27

你得叫後ft.commit()fm.getBackStackEntryCount()之前fm.executePendingTransactions()。因爲commit()只爲稍後的傳遞安排事務。

+3

我知道這個答案是2年前,但我有類似的問題,並呼籲'getSupportFragmentManager()executePendingTransactions();'後提交,並沒有解決問題。你能提出其他改變嗎? –

+0

在commit()之後調用executePendingTransactions()時,會引發異常。如果在getBackStackEntryCount()之前調用,則count仍然爲零。 –

5

回答這個問題可能爲時已晚。無論如何,希望這個答案能幫助別人。

它主要取決於你在哪裏實際調用getBackStackEntryCount()方法。在我的情況下,我調用super.onBackPressed()後調用了這個方法。在調用這個方法的那一刻,堆棧中沒有碎片。這就是爲什麼我總是接受調用onBackPressed()方法的0

正確方法:

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

這解決了我的問題,謝謝! – Ethan

2

另一種解決方案是使用FragmentManager.OnBackStackChangedListener

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

我也有類似的問題,在我的case getFragmentManager()。getBackStackEntryCount()總是返回零。

我的問題是我一直在使用支持片段:

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

fragmentManager.executePendingTransactions(); 

,我已經檢查getFragmentManager() backStackEntryCount,它總是返回零(它使用另一個片段經理):

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

而不是getSupportFragmentManager,它返回正確的數字:

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

希望它有幫助!

+2

Omg,這是所有開發人員的潛在錯誤源。謝啦。 –

1

回答這個問題可能爲時已晚。無論如何,希望這個答案能幫助別人。

你應該的onResume getBackStackEntryCount()()方法。

這將是這樣的:

@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()); 
    } 
} 

祝你好運!

相關問題