getBackStackEntryCount()始终返回0,即使在添加addToBackStack和executeEnd



我有两个活动A和B。活动A有一个mapFragment,我将它添加到backback中。当我从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。

提前谢谢。

我也遇到过类似的问题,在我的案例中,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();         
    }
}

试试这个:

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

可以肯定的是,如果你替换了一个片段,那么它就不在后台:)

我也有类似的问题。多亏了这个答案,我在活动中创建了以下代码,而不是碎片,这个解决方案运行良好:

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

问题在于如何添加和删除片段。

如果使用supportFragmentManager添加,则必须使用supportFragmentManager和backStackEntryCount。

如果使用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

我有另一个解决方案(漫游)来检测碎片,因为在我的示例中,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();
        }

最初在这里成立。

只需将getFragmentManager()替换为getSupportFragmentManager()。简单的解决方案。它对我有用。您需要在活动上执行此操作

谷歌已经弃用getFragmentManager(),所以总是使用getSupportFragmentManager()

查看此处了解更多信息。

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

最新更新