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

bei*_*bei 12 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();
    }
Run Code Online (Sandbox Code Playgroud)

当我想通过调用fm.getBackStackEntryCount()得到堆栈cout时,它返回零?

Arv*_*vis 28

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

  • 我知道这个答案是从2年前开始的,但我遇到了类似的问题并调用了`getSupportFragmentManager().executePendingTransactions();`在提交后没有解决问题.你能建议其他任何改变吗? (3认同)

Neo*_*gma 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();
Run Code Online (Sandbox Code Playgroud)

我检查了getFragmentManager() backStackEntryCount,它总是返回零(它使用另一个片段管理器):

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ) {
        getFragmentManager().popBackStack();            
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是getSupportFragmentManager,它返回正确的数字:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0 ) {
        getSupportFragmentManager().popBackStack();         
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 哦,这是所有开发人员的潜在漏洞源.谢啦. (3认同)

min*_*zur 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();
}
Run Code Online (Sandbox Code Playgroud)