Skip to content

databinding中的layout include

<include>标签可以实现在一个layout中引用另一个layout的布局。 对于有着相同模块的多个layout来说,可以把通用的部分抽出来成为一个公共layout。

使用方法

使用databinding后,在layout中可能会有variable。我们是可以把变量传递进去的。

首先来看我们的公共layout common.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable
            name="viewModel"
            type="com.rustfisher.t.vm" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:binding="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <!-- 公共 -->
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

common.xml中有一个变量viewModel,类型是com.rustfisher.t.vm

在其他layout中include这个layout。需要把外围的vm变量传递进去,使用app:viewModel="@{viewModel}标签。

<?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"
    xmlns:binding="http://schemas.android.com/tools">
    <data>
        <variable
            name="viewModel"
            type="com.rustfisher.t.vm" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include
            android:id="@+id/common_layout"
            layout="@layout/common"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:viewModel="@{viewModel}" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

公共layout和使用它的layout,持有的是同类型的变量。这样我们实现了layout的复用。

使用场景

使用场景一个是上文描述的,不同layout引用同一个公共layout。

另外一个场景,我们可基于此法实现屏幕适配。

例如在layout目录和layout-w600dp目录中都有common.xml。 在手机和平板我们可以实现不同的排版。