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 正确使用子子片段

Android中FragmentManager进行片段回收的目的是啥?

UIfragment与fragmentManager