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


102

尝试设置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}"/>

Answers:


232

如《Android开发人员指南》所述,您需要这样做:

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

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

6
以及如何设置“销售”的价值?
RobinHood

因此,您的意思是如何将值“ sale”分配给String变量?
David Artmann

究竟!我面临问题。请分享,我会进行比较,然后告知您。
RobinHood

40
该死的!我怎么想念傻进口。完成,谢谢。
RobinHood

嘿! 任何想法,为什么位置上滚动故障?配接器
RobinHood

58

在您的布局中:

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

3
您使我免于轻度头痛
Koen Van Looveren

2
您的数据模型必须是可观察的才能起作用。
yshahak

这对我没有包括的工作@Bindable。当我包括在内时,我遇到了不同的绑定错误,包括对extend的建议BaseObservable。这里的好指针
Gene Bo

2
必须是公认的答案!完美地为我工作!
Crisic

LiveData<Boolean>什么建议吗?
Sourav Bagchi

41

问题在于,这visibility是一个Integer关于View类的信息,这意味着您可以通过两种方式来完成此工作:

  1. 使用View.VISIBLEView.GONE常数。https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. 定义一个定制的制定者visibility,需要一个Booleanhttps://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}"/>工作。


4
在您方便的地方,注释处理器会在编译过程中自动检测到它们。
Kiskae

谢谢,我把它放在我的BindingUtils.java中
nhoxbypass

但是如何设定价值销售?
EslamWael74 '18年

1
如何将相同方法应用于<include标签?
Zafer Celaloglu

1
@ EslamWael74可以通过Java / Kotlin代码中的绑定设置销售价值。类似于val binding = MyClassBinding.inflate(...),然后您可以调用binding.sale = true。
马特·罗伯森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.