如何处理backstack用于与不同的数据替换在同一片段 [英] How to handle backstack for replacing the same fragment with different data
问题描述
为了1活动中的片段之间导航,我实现了一个名为 fragmentSwicher
方法,即获得一个片段,并与容器激活片段来替换它。
In order to navigate between fragments within 1 activity, I implemented a method called fragmentSwicher
, that gets a fragment and replaces it with activated fragment in container.
到目前为止好,但现在的问题是,我想重新使用不同的数据片段,但我的 fragmentSwitcher
办法拒绝改变,因为现有的片段在片段 backstack
。
So far so good, but now the problem is I want to re-use a fragment with different data, but my fragmentSwitcher
method refuses to change fragment because of existing the fragment in 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方法:
And this the method that handles backstack
in 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();
}
}
我试过这种方式部分地解决这个问题:我把
I tried to partially solve this issue this way: I put
ft.replace(R.id.main_container, frg, fragmentTag);
之外
if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
ft.replace(R.id.main_container, frg, fragmentTag);
}
和 fragmentSwitcher()
替换不同的数据相同的片段,但是当用户presses后退按钮,他/她将与此片段面对:
And fragmentSwitcher()
replaces the same fragment with different data, BUT when user presses the back button, s/he will face with this fragment:
com.thetba.websitebuilder.fragments.ProgressFragments
这是不是在 backstack
。
这是说,我应该怎么做处理 backstack
更换相同片段时?
That said, what should I do to handle backstack
when replacing same fragment?
推荐答案
此问题是因为更换相同片段类,但你可以重新填充碎片与其他数据,但是,处理的 BackStack
在这个解决方案是复杂的。
This problem is because of replacing same Fragment class, although you can just repopulate Fragment with another data, but, handling BackStack
in this solution is complicated.
因此,为了这一目的只有你能介绍为更换新名称新片段。要做到这一点,你可以在 backstackName
字符串的结尾添加一些随机的东西。
so, for this purpose only you can introduce new Fragment with new name for replacement. to do this, you can add some random things at the end of backstackName
string.
例如:
if (backStateName.contains("com.thetba.websitebuilder.fragments.PagesFragment")) {
backStateName += String.valueOf(getRandomInt(10, 500));
}
这篇关于如何处理backstack用于与不同的数据替换在同一片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!