Android: повторное использование макетов с использованием включения с параметрами

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

Сейчас у меня следующее:

layout_ordered_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="order"
            type="java.lang.String" />

        <variable
            name="text"
            type="java.lang.String" />
    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/order"
            android:layout_width="28dp"
            android:layout_height="28dp"
            android:layout_marginBottom="16dp"
            android:layout_marginStart="16dp"
            android:layout_marginTop="16dp"
            android:gravity="center"
            android:text="@{order}"
            android:textAlignment="center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="60dp"
            android:text="@{text}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>
</layout>

Затем я хотел бы использовать этот макет следующим образом:

layout_ordered_list.xml

<LinearLayout>

    <include layout="@layout/layout_ordered_list_item"
       bind:order="1"
       bind:text="First text content"/>
    <include layout="@layout/layout_ordered_list_item"
       bind:order="2"
       bind:text="Second text content"/>
    etc.
</LinearLayout>

Обратите внимание, что меня не интересует динамическая установка переменных в коде. Я использую эти макеты только с жестко закодированными значениями (или со строковыми ресурсами), как в моем примере. Но поскольку я использую их так много раз, я не хочу снова и снова копировать и вставлять элемент списка только для того, чтобы изменить порядок и текстовое содержимое. Я также знаю, что мой пример не работает, он здесь просто для того, чтобы продемонстрировать, как я хотел бы, чтобы он работал.

Я уже искал ответ в документах Android, но такого примера нет. https://developer.android.com/training/improving-layouts/reusing-layouts.html https://developer.android.com/topic/libraries/data-binding/index.html#includes

Практически идентичный вопрос также задавался ранее в SO, но также нет полезного ответа: Как повторно использовать макеты с ‹include/› с параметрами?


person m5seppal    schedule 18.09.2017    source источник
comment
Я думаю, что ваша последняя ссылка действительно отвечает на вопрос. Вам потребуется создать Compound Control/Compound View: developer .android.com/guide/topics/ui/   -  person Morrison Chang    schedule 18.09.2017
comment
@MorrisonChang Это звучит очень сложно, учитывая то, чего я хочу достичь. Я очень надеялся, что будет какое-то простое решение.   -  person m5seppal    schedule 18.09.2017


Ответы (1)


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

Подробности о языке выражений привязки данных можно найти здесь.

<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">

    <LinearLayout>
       <include layout="@layout/layout_ordered_list_item"
           bind:order="@{`1`}"
           bind:text="@{`First text content`}"/>
        <include layout="@layout/layout_ordered_list_item"
           bind:order="@{`2`}"
           bind:text="@{`Second text content`}"/>
    </LinearLayout>

</layout>
person M.Pomeroy    schedule 18.10.2018