Android:使用带参数的include重新使用布局

时间:2017-09-18 08:39:41

标签: android android-layout android-databinding

我创建了一个带有自定义样式的有序列表,该列表在多个地方使用。我尝试避免额外的代码并为列表项创建一个可重用的布局文件,该文件可以包含在带有某些参数的有序列表中。我怎么能这样做?

我现在所拥有的是:

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中也提出过几乎相同的问题,但也没有可用的答案:How to Re-using Layouts with <include/> with parameters?

1 个答案:

答案 0 :(得分:0)

通过使用数据绑定库使包含的布局膨胀,然后使用数据绑定语句传入硬编码文本,您应该能够实现所需的目标。

有关数据绑定表达语言的详细信息,请参见here

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