1

为了在 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也就是说,替换相同的片段时我应该怎么处理?

4

1 回答 1

0

这个问题是因为替换了相同的 Fragment 类,虽然你可以用另一个数据重新填充 Fragment,但是,BackStack在这个解决方案中处理很复杂。

所以,为了这个目的,你只能引入带有新名称的新 Fragment 进行替换。为此,您可以在backstackName字符串末尾添加一些随机的东西。

例子:

if (backStateName.contains("com.thetba.websitebuilder.fragments.PagesFragment")) {
       backStateName += String.valueOf(getRandomInt(10, 500));
}
于 2015-07-22T06:53:12.173 回答