片段 - 如果id不唯一,则替换容器

时间:2015-11-13 16:18:38

标签: android transactions fragment fragmentmanager

我的布局有两个具有相同ID的视图。如果我想查找视图,只需拨打parentView1.findViewById(R.id.content)parentView2.findViewById(R.id.content)即可获得正确的视图。

如果我想用片段替换容器,我可以以某种方式定义我想要替换哪一个吗?

2 个答案:

答案 0 :(得分:0)

片段管理器只接受id,所以,我认为,答案是否定的,你不能指定容器。但是你仍然可以找到它们。

作为一种解决方法,您可以使用片段包装容器,然后在这些片段内部ID将是唯一的;所以你可以做fragment1.replaceContent(...)之类的事情,其中​​.replaceContent(...)是你自己的方法。 Ofc,您需要确保您的引用正确,状态保存等。

答案 1 :(得分:0)

您应将相同的id布局包装在父布局中。然后将第二个容器的ID设置为其他整数。例如,布局文件如下所示:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
 <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/parent_one">

    <include layout="@layout/container" />

</LinearLayout>

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/parent_two">

    <include layout="@layout/container"/>

</LinearLayout>
</LinearLayout>

您将首先通过使用父ID来访问它们。然后将第二个容器的ID设置为其他容器。例如:

    val containerOneId = parent_one.container.id
    val containerTwoId = 1
    parent_two.container.id = containerTwoId

    openFragment(TestFragment().apply {
        val b = Bundle()
        b.putString(TestFragment.ARG, "Fragment one")
        arguments = b
    }, containerOneId)

    openFragment(TestFragment().apply {
        val b = Bundle()
        b.putString(TestFragment.ARG, "Fragment two")
        arguments = b
    }, containerTwoId)

使用相同的访问逻辑,但是使用Java(以防您未使用Kotlin)

    LinearLayout parentOne = (LinearLayout) findViewById(R.id.parent_one);
    LinearLayout parentTwo = (LinearLayout) findViewById(R.id.parent_two); 

    FrameLayout containerOne = parentOne.findViewById(R.id.container);
    FrameLayout containerTwo = parentTwo.findViewById(R.id.container);

    int containerOneId = containerOne.getId();
    int containerTwoId = 1;
    containerTwo.setId(containerTwoId);

    openFragment(new TestFragment(), containerOneId);
    openFragment(new TestFragment(), containerTwoId);