我创建了一个带有自定义样式的有序列表,该列表在多个地方使用。我尝试避免额外的代码并为列表项创建一个可重用的布局文件,该文件可以包含在带有某些参数的有序列表中。我怎么能这样做?
我现在所拥有的是:
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?
答案 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>