即使在添加addToBackStack和executePendingTransactions()之后,getBackStackEntryCount()也始终返回0

时间:2015-03-19 15:22:21

标签: android fragmentmanager

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

提前致谢。

7 个答案:

答案 0 :(得分:57)

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

答案 1 :(得分:2)

我有类似的问题。感谢this answer我在我的活动中创建了以下代码,而不是片段,这个解决方案正常工作:

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

答案 2 :(得分:1)

试试这个:

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.replac(R.id.container, mMapFragment);

到此:

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

非常确定如果你替换一个片段,那么它不在backstack中:)

答案 3 :(得分:0)

我有另一个解决方案(四处走动)来检测片段,因为在我的例子中, FM.getBackStackEntryCount()也返回0而 FM.executPendingTransactions 没有工作

以下是我添加新片段的方法:

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

Orginally成立here

答案 4 :(得分:0)

只需将getFragmentManager()替换为getSupportFragmentManager()即可。简单解决方案它对我有用。 你需要在你的活动

上做

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

google已弃用getFragmentManager(),因此请始终使用getSupportFragmentManager()

Check Here了解更多信息。