我有以下代码:
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()?
谢谢!
答案 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();
}