使用数据绑定设置视图可见性

Use data binding to set View visibility

正在尝试使用自定义变量设置 View 的可见性,但出现错误:Identifiers must have user defined types from the XML file. visible is missing it。是否可以使用数据绑定设置视图可见性?谢谢

<data>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? visible : gone}"/>

问题是 visibilityView class 上的 Integer,这意味着您有两种方法可以完成这项工作:

  1. 使用 View.VISIBLEView.GONE 常量。 https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. 为采用 Booleanvisibility 定义自定义 setter。 https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

可能的实现:

@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
    view.setVisibility(value ? View.VISIBLE : View.GONE);
}

这将使 <FrameLayout android:visibility="@{sale}"/> 工作。

Android Developer Guide中所述,您需要这样做:

<data>
    <import type="android.view.View"/>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>

在您的布局中:

<data>
    <variable
        name="viewModel"
        type="...."/>
</data>


<View
 android:layout_width="10dp"
 android:layout_height="10dp"
 android:visibility="@{viewModel.saleVisibility, default=gone}"/>

在您的 ViewModel java 代码中:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}

类似于解决方案。将此方法放在单独的文件中,例如 Bindings.kt:

@BindingAdapter("android:visibility")
fun View.bindVisibility(visible: Boolean?) {
    isVisible = visible == true
    // visibility = if (visible == true) View.VISIBLE else View.GONE
}

然后在布局中XML:

<data>

    <variable
        name="viewModel"
        type="SomeViewModel" />
</data>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="@{viewModel.number == 1}" />