如何避免片段重复问题?

时间:2017-08-10 18:52:04

标签: android android-fragments android-fragmentactivity android-lifecycle fragmentmanager

我有以下代码:

private List<WeakReference<Fragment>> mFragList = new ArrayList<WeakReference<Fragment>>();

@Override
public void onAttachFragment (Fragment fragment) {
    mFragList.add(new WeakReference(fragment));
}

public List<Fragment> getActiveFragments() {
    ArrayList<Fragment> ret = new ArrayList<Fragment>();
    for(WeakReference<Fragment> ref : mFragList) {
        Fragment f = ref.get();
        if(f != null) {
            if(f.isVisible()) {
                ret.add(f);
            }
        }
    }
    return ret;
}

public Fragment findFragement(String tClass) {

    List<Fragment> fragments = getActiveFragments();
    for (Fragment fragment : fragments) {
        if (tClass.equalsIgnoreCase("Home")) {
            if (fragment instanceof ToggleFragment) {
                return fragment;

            }
        } else if (tClass.equalsIgnoreCase("Contacts")) {
            if (fragment instanceof ContactFragment) {
                return fragment;
            }
        }
    }
    return null;
}

代码工作正常,但我有一个问题,不会是这段代码:

@Override
public void onAttachFragment (Fragment fragment) {
    mFragList.add(new WeakReference(fragment));
}

重新创建屏幕或使用ft.replace()时会导致重复吗?

有更好的解决方法吗?没有替换太多代码或没有使用getsupportfragmentmanager.getfragments()?

谢谢!

1 个答案:

答案 0 :(得分:1)

保证不重复的一种方法是使用地图。您可以将此行添加到班级的顶部

private static final String TAG = "MyFragmentClassName";

然后,您可以使用

而不是ArrayList
Map<String, WeakReference<Fragment>> fragmentMap = new HashMap<>();

并使用

将片段添加到地图中
map.put(TAG, myWeakReferenceInstance);

当您想要添加项目时,您可以通过检查

来检查该位置是否已存在
if (map.get(TAG) != null) {
    //do something
}

这应该对你有用,但我仍然建议使用getSupportFragmentManager()。你可以用它完成所有这些以及更多。例如,这是我在此音乐应用中使用的一些代码:

private void showAlbumListFragment() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    albumListFragment = new AlbumListFragment();
    fragmentManager.beginTransaction()
            .replace(R.id.fragment_container, albumListFragment, AlbumListFragment.TAG)
            .commit();
}

如果您想避免重复,可以添加几行:

private void showAlbumListFragment() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    albumListFragment = (AlbumListFragment) fragmentManager.findFragmentByTag(AlbumListFragment.TAG);
    if (albumListFragment == null) {
        albumListFragment = new AlbumListFragment();
    }
    fragmentManager.beginTransaction()
            .replace(R.id.fragment_container, albumListFragment, AlbumListFragment.TAG)
            .commit();
    }