如何处理backstack用于与不同的数据替换在同一片段 [英] How to handle backstack for replacing the same fragment with different data

查看:158
本文介绍了如何处理backstack用于与不同的数据替换在同一片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆