为了在 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();
}
这是backstack
在 MainActivity 中处理的方法:
@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
也就是说,替换相同的片段时我应该怎么处理?