Добавить два разных фрагмента в два макета с одинаковым тегом body? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь добавить два разных фрагмента в два контейнера в моей деятельности. Контейнеры являются частью разборного представления, которое я сделал:

collapsible_view.xml

    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/collapsible_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:gravity="center"/>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/collapsible_body"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

Я пытаюсь использовать контейнер collapsible_body.

IЯ хочу добавить два из этих представлений в мой макет деятельности, а затем добавить отдельный фрагмент в каждом collapsible_body. Однако использование fragmentTransaction.replace(R.id.collapsible_body...) не указывает , который заменяет один из моих двух видов collapsible_body.

По сути, такой же, как этот вопрос здесь: Фрагмент - заменить контейнер, если идентификатор не уникален

1 Ответ

0 голосов
/ 14 октября 2019

Вы должны поместить одинаковые макеты идентификаторов в родительский макет. А затем установите идентификатор для второго контейнера в другое целое число. Например, файл макета будет выглядеть следующим образом:

<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>

И вы сначала получите доступ к ним, используя родительские идентификаторы. Затем установите идентификатор для второго контейнера на другой. Например:

    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);
...