【问题标题】:Why FragmentManager's getBackStackEntryCount() return zero?为什么 FragmentManager 的 getBackStackEntryCount() 返回零?
【发布时间】:2012-12-07 12:21:34
【问题描述】:
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 时,它返回零?

【问题讨论】:

  • bool init 的值是多少?
  • 无论真假,永远为零。

标签: android fragment


【解决方案1】:

您必须在ft.commit() 之后或fm.getBackStackEntryCount() 之前调用fm.executePendingTransactions()。因为 commit() 只为以后的传递安排事务。

【讨论】:

  • 我知道这个答案来自 2 年前,但我遇到了类似的问题,并且在提交后调用 getSupportFragmentManager().executePendingTransactions(); 并没有解决问题。你能提出任何其他的改变吗?
  • 在 commit() 之后调用 executePendingTransactions() 时,会抛出异常。如果在 getBackStackEntryCount() 之前调用,则 count 仍然为零。
【解决方案2】:

我遇到了类似的问题,在我的情况下 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();         
    }
}

希望对你有帮助!

【讨论】:

  • 天哪,这对所有开发人员来说都是一个潜在的错误来源。谢谢大佬。
【解决方案3】:

现在回答这个问题可能为时已晚。希望这个答案无论如何都会对某人有所帮助。

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

    【讨论】:

      【解决方案5】:

      现在回答这个问题可能为时已晚。希望这个答案无论如何都会对某人有所帮助。

      你应该在 onResume() 中获取 BackStackEntryCount() 方法。

      会是这样的:

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

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        相关资源
        最近更新 更多