我有两个活动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。
提前致谢。
答案 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了解更多信息。