【问题标题】:FragmentManager add multiple instances of the same Fragment typeFragmentManager 添加多个相同 Fragment 类型的实例
【发布时间】: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_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" />

只要片段的类型不同,这一切都很好。

但是,如果我创建已经存在的片段类型的第二个实例,则会出现异常:

java.lang.IllegalStateException: Fragment already added: TestFragment{1184e8a1 #0 id=0x7f0800ef com.test.ui.TestFragment}

如何添加同一片段的多个实例?

一个要求是它们都在彼此的顶部 - 因为它们中很少有小边距可以让您看到下面的片段的一小部分。

感谢您的帮助!

【问题讨论】:

  • 1) 为每个添加的片段使用不同的标签。 2) 确保将它们添加到FrameLayout(将它们堆叠在一起)而不是LinearLayout(将它们并排放置)。

标签: android android-fragments fragment android-fragmentactivity


【解决方案1】:

父片段的布局

<FrameLayout
    android:id="@+id/fragment_contentrow"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

父片段中添加子片段的代码

 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 的新实例
  • 你也改标签了吗?
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 2019-05-26
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多