为什么FragmentManager的getBackStackEntryCount()返回零?

时间:2012-12-20 02:29:41

标签: android fragment

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()获取堆栈计数时,它返回零?

5 个答案:

答案 0 :(得分:28)

您必须在fm.executePendingTransactions()之后或ft.commit()之前致电fm.getBackStackEntryCount()。因为commit()仅为稍后的传递调度事务。

答案 1 :(得分:18)

我有类似的问题,在我的例子中是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 :(得分:5)

回答这个问题可能为时已晚。希望这个答案无论如何都能帮到别人。

主要取决于你实际调用getBackStackEntryCount()方法的位置。在我的例子中,我在调用super.onBackPressed()之后调用了这个方法。调用此方法的那一刻,后端堆栈中没有碎片。这就是为什么我总是收到0。

在onBackPressed()中调用方法的正确方法:

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

答案 3 :(得分:4)

另一种解决方案是使用FragmentManager.OnBackStackChangedListener

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

答案 4 :(得分: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());
    }
}
祝你好运!