ViewBinding - 如何在 ViewBinding 中设置包含布局的可见性?

ViewBinding - How to set visibility for include layout in ViewBinding?

我使用包含布局,我需要更改它的可见性:

 <include
    android:id="@+id/layout_provinces"
    layout="@layout/layout_select_provinces"
     />

和layout_select_provinces是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/select_province"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="@color/white"
 android:visibility="gone">

    <LinearLayout
        android:id="@+id/layout_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/background_color"
        android:orientation="vertical">

        <TextView
            android:id="@+id/txt_state"
            style="@style/FontIranBold"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="@dimen/_8sdp"
            android:layout_marginRight="@dimen/_4sdp"
            android:layout_marginBottom="@dimen/_8sdp"
            android:text="@string/txt_select_province"
            android:textSize="@dimen/font_size_small" />

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/_1sdp"
            android:background="@color/gray_special" />

    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_estate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/layout_top"
        android:layout_marginTop="@dimen/_8sdp" />

但是当我将 Id 设置为 RelativeLayout 时,我的应用程序崩溃并且我无法更改可见性:

     binding.layoutProvinces.selectProvince.setVisibility(View.GONE);

有没有人可以帮我处理 ViewBinding 设置 id 的过程?

要使 DataBinding 正常工作,您需要将 <layout> 标记作为根标记。因此,将 xml 代码包装在 <layout> 中,如下所示:

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

    <RelativeLayout
     android:id="@+id/select_province"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:background="@color/white"
     android:visibility="gone">

        <LinearLayout
            android:id="@+id/layout_top"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/background_color"
            android:orientation="vertical">

            <TextView
                android:id="@+id/txt_state"
                style="@style/FontIranBold"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="@dimen/_8sdp"
                android:layout_marginRight="@dimen/_4sdp"
                android:layout_marginBottom="@dimen/_8sdp"
                android:text="@string/txt_select_province"
                android:textSize="@dimen/font_size_small" />

            <View
                android:layout_width="match_parent"
                android:layout_height="@dimen/_1sdp"
                android:background="@color/gray_special" />

        </LinearLayout>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler_estate"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/layout_top"
            android:layout_marginTop="@dimen/_8sdp" />

    </RelativeLayout>

</layout>

当我们给 <include> 一个 id 时,它会覆盖我们包含的根布局的 id。在您的例子中,layout_provinces 覆盖了 <RelativeLayoutselect_province。因此,当您访问相对布局时,它会给您一个错误,因为它不再存在。

您可以做的是删除相对布局的 id,只提供 id 以包含和访问您通过 getRoot() 方法包含的根布局,如下所示。

Java

binding.selectProvince.getRoot().setVisibility(View.GONE)

Kotlin

binding.selectProvince.root.visibility = View.GONE

View Binding 中的 getRoot() 方法 returns 在您的情况下给定布局的最顶层视图是 RelativeLayout