getBackStackEntryCount() 在添加了 addToBackStack 和 executePendingTransactions() 之后始终返回0。

26

我有两个活动A和B。Activity A有一个mapFragment,我将它添加到了回退栈中。当我从 B 返回到Activity A时,我希望该片段以与离开它时相同的状态显示。但是getFragmentManager()。getBackStackEntryCount()返回0。这是我的代码:

MapFragment mMapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    mMapFragment.getMapAsync(this);
    fragmentTransaction.replace(R.id.container, mMapFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    getFragmentManager().executePendingTransactions();
当从活动B返回时,我需要知道getBackStackEntryCount()的数量:
System.out.println("Number of entries in backstack "+ getFragmentManager().getBackStackEntryCount());

这个显示为0。

提前感谢。

8个回答

67

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

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

使用getSupportFragmentManager的替代方法,可以返回正确的数量:

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

1
谢谢回答。当我将getFragmentManager()改为getSupportFragmentManager()时,确实起作用了。 - Parthiban M
但是为什么呢?我正在使用常见的Fragments和常见的FragmentManager,我怎么知道在这种情况下使用的是哪个FM - common还是support? - Anton
这取决于你是否导入android.support.v4.app.FragmentManager或android.app.FragmentManager。 - Neonigma

3

试试这个:

MapFragment mMapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    mMapFragment.getMapAsync(this);
    fragmentTransaction.add(R.id.container, mMapFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    getFragmentManager().executePendingTransactions();

我已更改此行:

fragmentTransaction.replace(R.id.container, mMapFragment);

转换为:

fragmentTransaction.add(R.id.container, mMapFragment);

很确定,如果您替换了一个片段,则不会在后退堆栈中 :)

除了将 replace() 替换为 add(),您还需要添加 .addToBackStack(null) - Alexander Farber

2
我有类似的问题。感谢这个答案,我在我的活动中创建了下面的代码,而不是片段,并且这个解决方案工作得很好:
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Log.d("ovech", "back stack changed");
            Log.d("ovech", "back stack count = " + getSupportFragmentManager().getBackStackEntryCount());
            if(getSupportFragmentManager().getBackStackEntryCount()>0) {
                toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp);
            } else {
                toolbar.setNavigationIcon(null);
                Log.d("ovech", "hello without icon");
            }
            toolbar.invalidate();
        }
    });

1
问题在于你如何添加和删除片段。
如果你使用的是 supportFragmentManager 来添加,你必须使用带有 backStackEntryCount 的 supportFragmentManager
如果你使用 fragmentManager 添加,则应使用 fragmentManager 来获取片段数量(backStackEntryCount)。
// **Kotlin**
// AddFragment
val ft = supportFragmentManager.beginTransaction()
ft.replace(R.id.activity_base_content, f)
ft.addToBackStack(null)
ft.commit()

// Get amount of fragments 
supportFragmentManager.backStackEntryCount

0

我有另外一种解决方案(绕过)来检测片段,因为在我的例子中,FM.getBackStackEntryCount() 也返回了0,而且 FM.executePendingTransactions() 也没有起作用。

所以这是我如何添加一个新的片段:

getFragmentManager().beginTransaction()
                        .add(contextLayout.getId(), toolFragment, FRAG_TOOL_TAG)
                        .setCustomAnimations(R.anim.tool_frag_in, R.anim.tool_frag_out)
                        .commit();

这是我如何移除它的方法:

Fragment prevTool = getFragmentManager().findFragmentByTag(FRAG_TOOL_TAG);
        if(prevTool != null){
            getFragmentManager().beginTransaction().remove(prevTool).commit();
        }else {
            intentCANCELED();
        }

最初成立于这里


0

Google已经弃用了getFragmentManager(),因此请始终使用getSupportFragmentManager()

欲知更多信息,请查看这里


0

只需将getFragmentManager()替换为getSupportFragmentManager()。简单的解决方案。对我有效。 你需要在你的Activity中这样做。


0
如果您正在使用 childFragmentManager.beginTransaction(),请尝试使用 parentFragmentManager.beginTransaction()(在扩展 Fragment 的情况下使用,例如 BaseFragment,并在其中添加/替换。)

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