如何处理用不同数据替换相同片段的后台堆栈

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));
}