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

试图使用自定义变量设置 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}"/>
102489 次浏览

问题是 visibilityView类中的 Integer,这意味着你有两种方法来实现这个目标:

  1. 使用 View.VISIBLEView.GONE常量
  2. 为接受 Boolean.https://developer.android.com/topic/libraries/data-binding/index.html#custom_settersvisibility定义一个自定义 setter

可能实施的措施:

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

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

正如在 Android 开发者指南中指出的,你需要这样做:

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

类似于 Kiskae解决方案,将这个方法放在一个单独的文件中,例如 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}" />