0

我有以下代码:如何避免片段重复问题?

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

确保没有重复的一种方法是使用地图。您可以将该行添加到您的类的顶部

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

有没有其他方法可以确保重复不会发生?你能否解释我的代码,如果可能的话,会更容易理解。 hashmap –

+0

最简单的方法我可以不用fragmentManager就可以想到的最简单的方法就是创建一个独特的属性(可能是一个字符串),它对于每个片段实例都是常量,对于每种类型的片段都是不同的(我喜欢调用我的“TAG”)。然后,你可以遍历你的ArrayList,并检查你的任何片段是否有你想要放入的片段的TAG,如果有,请替换它们。 – evanklicker

+1

是否有一个特别的原因,你不能使用fragmentManager?这正是他们设计要处理的。 – evanklicker