我有三个片段A,B和C
这是路径:A - > B - > C: A 转到 B , B 转到 C
当我从片段C返回时,我想转到片段A。
但我的问题是当我回到片段C时,我得到了这个行为:似乎片段C没有从后台堆栈中清除:
至于我的代码,这是replaceFragment的方法:
public void replaceFragment(Fragment fragment, boolean withBackStack) {
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
String fragmentTag = fragment.getClass().getName();
fragmentTransaction.replace(R.id.frame, fragment, fragmentTag);
if (withBackStack)
fragmentTransaction.addToBackStack(fragmentTag);
try {
fragmentTransaction.commitAllowingStateLoss();
} catch (IllegalStateException ex) {
ex.printStackTrace();
}
}
首先我在replaceFragment(new AFragment(), false);
中调用了MainActivity
,然后在片段A 中点击了按钮,我调用了mListener.replaceFragment(new BFragment(), true);
最后,在点击按钮的片段B 中,我拨打了mListener.replaceFragment(new CFragment(), false);
有没有人对此行为有解释?单击后退时不应清除最后一个片段C?
Here,你会发现整个例子。 提前谢谢!
答案 0 :(得分:1)
由于你没有在backstack中添加fragC而不会弹出存储的事务,因此不会删除它。在这里你必须通过覆盖backpress.Overiride backpress删除片段并检查fragC并删除它然后调用pospstack弹出存储的事务。
还将片段实例存储为全局,以检查片段是否为fragC。
private Fragment mFragment;
在你的方法中存储实例
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(mFragment.getClass().getName());
if (fragment != null && fragment.getClass().getName().equalsIgnoreCase(CFragment.class.getName())) {
getSupportFragmentManager().beginTransaction().remove(mFragment).commit();
}
getSupportFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
}
答案 1 :(得分:0)
基于@Anonymous的答案,我找到了解决这个问题的一般方法:
@Override
public void onBackPressed() {
Fragment currentFragment= getSupportFragmentManager().findFragmentById(R.id.frame);
super.onBackPressed();
if(currentFragment!=null && currentFragment.isVisible()) {
getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
getSupportFragmentManager().popBackStack(currentFragment.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}