我对Android开发还比较新,现在遇到了一些奇怪的问题。
- 我有一个空的FrameLayout作为碎片的容器。
- 如果用户第一次按按钮,就生成新的碎片并放置在容器中。
- 如果用户后来再次按按钮,并且容器内已经存在碎片,则用新生成的碎片替换现有的碎片。
- 如果用户按返回按钮,则弹出容器内的碎片。
这是我的代码:
public void showFragment(View v) {
FragmentA f = new FragmentA();
FragmentManager fm = getSupportFragmentManager();
String tag = f.getFragmentTag(); // instance method of a to get a tag
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_top, 0, 0, R.anim.slide_out_top);
ft.replace(R.id.container, f, tag);
ft.addToBackStack(tag);
ft.commit();
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
} else {
super.onBackPressed();
}
}
当用户第一次按下按钮时,它的行为符合我的期望,将新片段添加到容器中。但是,当容器仍然包含一个片段时,用户第二次按下按钮时,它不是替换,而是在现有片段之上添加新的片段。因此,容器中有2个片段,需要按2次返回键才能删除所有片段。
我发现如果我删除这行代码
ft.addToBackStack();
将onBackPress()方法重新处理如下,它会像我预期的那样再次工作(每次在容器中只有1个片段)
基本上是手动删除片段,而不是使用popFromBackStack方法
private FragmentA currentFragment = null; // to hold the reference to exising fragment, if any.
@Override
public void onBackPressed() {
if (currentFragment != null) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(0, R.anim.slide_out_top);
ft.remove(currentFragment);
ft.commit();
currentFragment = null;
} else {
super.onBackPressed();
}
}
所以,我的问题是:
- replace和addToBackStack不可以一起使用吗?
- 还是说我做错了什么?
非常感谢所有的评论和建议。