如何处理用不同数据替换相同片段的后台堆栈
How to handle backstack for replacing the same fragment with different data
为了在 1 activity 内的片段之间导航,我实现了一个名为 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()
用不同的数据替换同一个片段,但是当用户按下后退按钮时,s/he将面对这个片段:
com.thetba.websitebuilder.fragments.ProgressFragments
不在 backstack
.
也就是说,替换相同片段时我应该如何处理backstack
?
这个问题是因为替换了同一个片段class,虽然你可以用另一个数据重新填充片段,但是,在这个解决方案中处理BackStack
很复杂。
因此,为此目的,您只能引入新名称的新 Fragment 进行替换。为此,您可以在 backstackName
字符串的末尾添加一些随机的东西。
示例:
if (backStateName.contains("com.thetba.websitebuilder.fragments.PagesFragment")) {
backStateName += String.valueOf(getRandomInt(10, 500));
}
为了在 1 activity 内的片段之间导航,我实现了一个名为 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()
用不同的数据替换同一个片段,但是当用户按下后退按钮时,s/he将面对这个片段:
com.thetba.websitebuilder.fragments.ProgressFragments
不在 backstack
.
也就是说,替换相同片段时我应该如何处理backstack
?
这个问题是因为替换了同一个片段class,虽然你可以用另一个数据重新填充片段,但是,在这个解决方案中处理BackStack
很复杂。
因此,为此目的,您只能引入新名称的新 Fragment 进行替换。为此,您可以在 backstackName
字符串的末尾添加一些随机的东西。
示例:
if (backStateName.contains("com.thetba.websitebuilder.fragments.PagesFragment")) {
backStateName += String.valueOf(getRandomInt(10, 500));
}