我是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(); } }
所以,我的问题是
替换和addToBackStack不一起工作?
或者,我做错了什么?
感谢所有意见和建议.
addToBackstack
创建片段状态的快照.这意味着当您按下后退按钮时,实际上您将恢复到上次addToBackstack
调用的状态.
在您的情况下,您添加片段.后退按钮将删除此添加的片段.当你调用replace并再次添加到backstack时,你现在在backstack上有两个状态(1.当你添加了第一个片段时,2.当你没有添加片段时).如果您使用后退按钮删除当前片段,则不要使用addToBackstack.如果要保留视图中片段的状态,请仅使用addToBackstack.