【问题标题】:How to avoid fragment duplication issue?如何避免片段重复问题?
【发布时间】:2017-08-10 18:52:03
【问题描述】:

我有以下代码:

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() ?

谢谢!

【问题讨论】:

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


    【解决方案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();
        }
    

    【讨论】:

    • 没有其他方法可以确保不会发生重复吗?如果可能的话,你能解释一下我的代码吗,会更容易理解。不太擅长hashmap
    • 不使用片段管理器我能想到的最简单的方法是为片段的每个实例创建一些唯一属性(可能是字符串),并且对每种类型的片段都不同(我喜欢称我的“标签”)。然后,您可以遍历您的 ArrayList 并检查您的任何片段是否具有您要放入其中的片段的 TAG,如果有,请替换它们。
    • 您不能使用 fragmentManager 有什么特殊原因吗?这正是它们的设计目的。
    • 我尽量避免使用 supportmanager,因为它已被弃用,并可能导致编译时问题
    • 您应该使用 FragmentManager.findFragmentByTag(String tag) 来查找片段,而不是 getFragments()。我将编辑我的答案,以更清晰地展示如何使用它的示例。
    猜你喜欢
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2019-10-06
    相关资源
    最近更新 更多