我有两个活动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并在其中添加/替换。)