Android 如何避免片段重复问题?

Android 如何避免片段重复问题?,android,android-fragments,android-fragmentactivity,android-lifecycle,fragmentmanager,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&l

我有以下代码:

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;
}
在重新创建屏幕或使用ft.replace()时是否会导致重复

有没有更好的办法?不替换太多代码或不使用getsupportfragmentmanager.getfragments()


谢谢

保证没有重复的一种方法是使用地图。你可以把这一行加到你班的最上面

private static final String TAG = "MyFragmentClassName";
然后,您可以使用

Map<String, WeakReference<Fragment>> fragmentMap = new HashMap<>();
当您想要添加项目时,您可以通过检查来检查该位置是否已存在某些内容

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

有没有其他方法可以确保复制不会发生?你能解释一下我的代码吗?如果可能的话,会更容易理解。不太擅长HashMap在不使用fragmentManager的情况下,我能想到的最简单的方法是创建一些独特的属性(可能是一个字符串),该属性对于片段的每个实例都是常量,对于每种类型的片段都是不同的(我喜欢称我的“标记”)。然后,你可以遍历你的ArrayList,检查你的任何片段是否有你试图放入其中的片段的标签,如果有,就替换它们。你不能使用fragmentManager有什么特别的原因吗?这正是他们设计用来处理的。我尽量避免使用supportmanager,因为它已弃用,并且可能会导致编译时问题。您应该使用FragmentManager.findFragmentByTag(字符串标记)来查找片段,而不是getFragments()。我将编辑我的答案,以更清楚地展示如何使用它。
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();
    }