为什么FragmentManager的getBackStackEntryCount()方法返回0?

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


bool init的值是什么? - Arvis
无论是真还是假,它总是零。 - beiliubei
5个回答

29

在调用ft.commit()之后或fm.getBackStackEntryCount()之前,您需要调用fm.executePendingTransactions()。因为commit()仅安排事务以供稍后执行。


4
我知道这个答案是两年前的,但我遇到了类似的问题,在提交后调用getSupportFragmentManager()。executePendingTransactions();没有解决问题。你能建议其他的更改吗? - Rain Man
当在commit()之后调用executePendingTransactions()时,会抛出异常。如果在调用getBackStackEntryCount()之前调用,则计数仍为零。 - Ray Hunter

19

我遇到了类似的问题,在我的情况下,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,但它总是返回零(它使用另一个片段管理器):

而我一直在检查getFragmentManager()的backStackEntryCount,但始终返回0(因为它正在使用另一个片段管理器):

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

使用 getSupportFragmentManager 会返回正确的数字,而不是其他方法:

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

希望能够帮到您!


3
哇,这对所有开发人员来说都是一个潜在的漏洞来源。谢谢你。 - Roman Minenok

6

也许已经晚了回答这个问题,但我希望这个答案能对某些人有所帮助。

这主要取决于您实际调用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();
}

4

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

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

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

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接