如何处理用不同数据替换相同片段的backstack



为了在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));
}

最新更新