我对 Android 开发相当陌生,现在遇到了奇怪的行为。
- 我有一个空的 FrameLayout 作为片段的容器。
- 如果用户第一次按下按钮,则生成新的 Fragment 并放入容器中。
- 如果用户稍后按下按钮并且容器内有现有片段,则将现有片段替换为新生成的片段。
- 如果用户按下后退按钮,则弹出容器内的片段。
这是我的代码
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 不能一起工作?
- 或者,我做错了什么?
感谢所有意见和建议。