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

时间:2017-06-07 18:38:45

标签: android android-databinding

尝试使用自定义变量设置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}"/>

4 个答案:

答案 0 :(得分:97)

正如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}"/>

答案 1 :(得分:32)

在你的布局中:

...AND DATEPHYSICAL <= (SELECT lkpv FROM OLAP.dbo.laadimisaeg)

在您的ViewModel java代码中:

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


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

答案 2 :(得分:16)

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

  1. 使用View.VISIBLEView.GONE常量。 https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. visibility定义一个Boolean的自定义设置器。 https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters
  3. 可能的实施:

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

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

答案 3 :(得分:0)

类似于 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}" />
相关问题