【问题标题】:ViewBinding - How to set visibility for include layout in ViewBinding?ViewBinding - 如何在 ViewBinding 中设置包含布局的可见性?
【发布时间】:2020-04-27 06:52:08
【问题描述】:

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

 <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 过程?

【问题讨论】:

  • 我想我知道你做错了什么.. 但首先,添加布局 XML layout_select_provinces 代码你在 &lt;include&gt; 中添加
  • 请再检查一次,我拼错了。中间代码用于 layout_select_province。问题是我无法为包含标签(我的意思是“layout_provinces”)和 RelativeLayout(我的意思是“select_province”)设置 Id,应用程序崩溃,但我需要它们,ViewBinding 和setVisibility 需要第二个 ID。

标签: android-layout android-view android-viewbinding


【解决方案1】:

当我们给 &lt;include&gt; 一个 id 时,它会覆盖我们包含的根布局的 id。在您的情况下,layout_provinces 覆盖了&lt;RelativeLayout 的select_province。因此,当您访问相对布局时,它会给您一个错误,因为它不再存在。

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

Java

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

科特林

binding.selectProvince.root.visibility = View.GONE

视图绑定中的getRoot() 方法返回给定布局的最顶层视图,在您的情况下它是RelativeLayout。

【讨论】:

  • 不应该是binding.layoutProvinces.root.visibility = View.GONE,因为你说要“删除相对布局的id”,即select_province“只给id包含”,即layout_provinces?
【解决方案2】:

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

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

【讨论】:

  • 这完全错误。 &lt;layout&gt; 是 DataBinding 所必需的,而不是 View Binding 所必需的
  • 糟糕,我不知道其中的区别。
  • 问题中已经添加了包含布局代码。您可以与用于设置可见性的 id 进行交叉检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多