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