包含tag和dataBinding

时间:2016-10-05 06:48:56

标签: android xml android-layout android-databinding

我希望使用include在同一视图中多次使用我的一个布局。假设我有一个custom.xml,包含一些TextView s。

custom.xml

 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

我已在parent.xml中多次包含此布局:

 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <include layout="@layout/custom"
        android:id="@+id/layout1"/>

    <include layout="@layout/custom"
        android:id="@+id/layout2"/>
</LinearLayout>

现在我想将我的数据模型绑定到此布局,但问题是我不知道如何将两个不同的数据模型绑定到layout1layout2,因为它们都被引用了从一个布局custom.xml。据我所知,我可以在我的xml布局中添加此标记:

    <data>
       <variable name="user" type="com.myproject.model.User"/>
   </data>

但我需要将两个不同的数据模型绑定到custom.xml

我的问题是如何在一个视图中多次包含布局并使用数据绑定将不同的数据传递给它们?类似于将数据传递给布局但不是将模型静态绑定到xml。

我还发现this问题确实存在同样的问题但是由于数据绑定是在较新版本的android中发布的,我正在寻找一种方法来解决使用数据绑定的相同问题。以下是我引用澄清的问题的一部分:

  

例如,我有一个我想要显示的精心设计的布局   在我看来,有三次。每个例子都需要不同   值。由于include基本上是XML并粘贴它   在这里,我需要更强大的东西。

3 个答案:

答案 0 :(得分:38)

您可以从parent.xml

传递
<include layout="@layout/custom"
    android:id="@+id/layout1"
    app:user="@{object of user1`}"/>

<include layout="@layout/custom"
    android:id="@+id/layout2"
    app:user="@{object of user2`}"/>

在这里,您需要从User

传递parent.xml个对象

确保custom.xml中有<data>

<data>
   <variable name="user" type="com.myproject.model.User"/>
</data>

:checked是与此相关的详细答案,请参阅

答案 1 :(得分:10)

我们知道如何在我们在setContentView()中使用的XML作为父视图使用POJO名称及其类型。如果我们从资源中包含任何布局,我们应该关注include标记,如下所示:

<?xml version="1.0" encoding="utf-8"?>

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

    <data>

        <variable
            name="user"
            type="exapmpe.model.User" />
    </data>

    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.AppBarLayout>

        <include
            layout="@layout/content_main"
            bind:user="@{user}" />

    </android.support.design.widget.CoordinatorLayout>

</layout>

在这里,我们使用 bind 属性传递对象,以在内容屏幕上显示详细信息。请确保bind:user="@{user}这两个地方的对象名称相同content_main.xml应如下所示:

<?xml version="1.0" encoding="utf-8"?>

<layout>

    <data>

        <variable
            name="user"
            type="exapmpe.model.User" />
    </data>

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/content_main" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName + user.lastName}" />

    </RelativeLayout>

</layout>

答案 2 :(得分:2)

问题在于包含的布局不被视为数据绑定布局,take a look here无法解决问题