FragmentManager 添加多个相同 Fragment 类型的实例
Posted
技术标签:
【中文标题】FragmentManager 添加多个相同 Fragment 类型的实例【英文标题】:FragmentManager add multiple instances of the same Fragment type 【发布时间】:2015-04-29 08:10:23 【问题描述】:我需要将片段“堆叠”在另一个之上。我这样做:
String className = fragment.getClass().getName();
FragmentManager fragmentManager = getChildFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_content, fragment, className);
fragmentTransaction.addToBackStack(className);
fragmentTransaction.commit();
在:
<FrameLayout
android:id="@+id/fragment_content"
android:layout_
android:layout_
android:orientation="horizontal" />
只要片段的类型不同,这一切都很好。
但是,如果我创建已经存在的片段类型的第二个实例,则会出现异常:
java.lang.IllegalStateException: Fragment already added: TestFragment1184e8a1 #0 id=0x7f0800ef com.test.ui.TestFragment
如何添加同一片段的多个实例?
一个要求是它们都在彼此的顶部 - 因为它们中很少有小边距可以让您看到下面的片段的一小部分。
感谢您的帮助!
【问题讨论】:
1) 为每个添加的片段使用不同的标签。 2) 确保将它们添加到FrameLayout
(将它们堆叠在一起)而不是LinearLayout
(将它们并排放置)。
【参考方案1】:
父片段的布局
<FrameLayout
android:id="@+id/fragment_contentrow"
android:layout_
android:layout_ />
父片段中添加子片段的代码
FragmentManager fm = getChildFragmentManager();
for (int x = 1; x < 5; x = x + 1)
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_contentrow, new MyChildFragment(), "Tag " + x);
ft.addToBackStack(null);
ft.commit();
【讨论】:
行不通,因为这打破了底部的要求(“......彼此顶部......”) 您是否在另一个片段中添加片段,因为您正在使用 getChildFragmentManager();在代码中? 是的,它们被添加到一个主片段中,该片段在启动时初始化并显示,但这不应该有所不同吗?【参考方案2】:尝试创建片段的新实例,而不是一遍又一遍地用相同的对象替换它。
fragment = new YourFragment();
fragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_content, fragment, className)
.addToBackStack(className);
.commit();
另外我建议在片段之间更改标签,例如你可以添加一个数字。
【讨论】:
是的,它每次都是 Fragment 的新实例 你也改标签了吗?以上是关于FragmentManager 添加多个相同 Fragment 类型的实例的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 docker 和 nginx 反向代理托管具有相同域但路径不同的多个网站例如:domain.fr/siteA、domain.fr/siteB、/siteC
如何实现 FragmentManager 和 FragmentTransaction 来替换单个片段?
Android FragmentManager 和 Fragment Result API
使用 (Child)FragmentManager 正确使用子子片段