为了在1个活动中的片段之间导航,我实现了一种称为fragmentSwicher
的方法,该方法获得片段并将其替换为容器中的激活片段。
到目前为止还不错,但现在的问题是我想重用不同数据的片段,但我的fragmentSwitcher
方法拒绝更改片段,因为存在backstack
中的片段。
public void fragmentSwitcher(Fragment frg) {
String backStateName = frg.getClass().getName();
String fragmentTag = backStateName;
FragmentManager manager = getFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
FragmentTransaction ft = manager.beginTransaction();
// check if fragment, is poped from backstack and there isnt any fragment in backstack like what we want to replace
if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
ft.replace(R.id.main_container, frg, fragmentTag);
}
// with this method, we make sure that, no loading fragment come into frament backstack list, so, we are back safe.
if (!backStateName.equals("com.thetba.websitebuilder.fragments.ProgressFragments")) {
ft.addToBackStack(backStateName);
}
ft.commit();
}
这是在MainActivity中处理backstack
的方法:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 1) {
finish();
// check if there is more than one fragment in backstack, show it
} else {
getFragmentManager().popBackStack();
}
}
我试图用这种方法部分解决这个问题:我把
ft.replace(R.id.main_container, frg, fragmentTag);
之外的 if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
ft.replace(R.id.main_container, frg, fragmentTag);
}
和fragmentSwitcher()
用不同的数据替换相同的片段,但是当用户按下后退按钮时,他/她将面对这个片段:
com.thetba.websitebuilder.fragments.ProgressFragments
不在backstack
.
也就是说,我应该怎么做来处理backstack
时,更换相同的片段?
这个问题是因为替换相同的Fragment类,虽然你可以用另一个数据重新填充Fragment,但是,在这个解决方案中处理BackStack
是复杂的。
所以,为了这个目的,你只能用新的名称引入新的Fragment来替换。要做到这一点,您可以在backstackName
string的末尾添加一些随机的东西。
的例子:
if (backStateName.contains("com.thetba.websitebuilder.fragments.PagesFragment")) {
backStateName += String.valueOf(getRandomInt(10, 500));
}