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

Posted

技术标签:

【中文标题】使用数据绑定设置视图可见性【英文标题】:Use data binding to set View visibility 【发布时间】:2017-11-09 06:20:27 【问题描述】:

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

【问题讨论】:

参考Android Data Binding: visibility on include tag 【参考方案1】:

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

【讨论】:

以及如何将值设置为“销售”? 那么您的意思是如何将值“sale”分配给字符串变量? 没错!我正面临问题。请分享我会比较然后让你知道。 该死!我多么怀念愚蠢的import。完成,谢谢。 嘿!知道为什么 position 在滚动时出现故障吗? Adapter【参考方案2】:

在您的布局中:

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


<View
 android:layout_
 android:layout_
 android:visibility="@viewModel.saleVisibility, default=gone"/>

在您的 ViewModel java 代码中:

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

【讨论】:

你让我免于轻微头痛 你的数据模型必须是 Observable 才能工作。 这对我有用没有包括@Bindable。当我包括在内时,我遇到了不同的绑定错误,包括扩展BaseObservable 的建议。这里的好指针 必须是公认的答案!它对我来说非常有用! LiveData&lt;Boolean&gt;有什么建议吗?【参考方案3】:

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

    使用View.VISIBLEView.GONE 常量。 https://developer.android.com/topic/libraries/data-binding/index.html#imports 为visibility 定义一个自定义设置器,它采用Boolean。 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);

这将使&lt;FrameLayout android:visibility="@sale"/&gt; 工作。

【讨论】:

在您方便的地方,注解处理器会在编译期间自动检测它们。 谢谢,我把它放在我的BindingUtils.java中 但是如何设置价值销售? 如何将相同的方法应用于 @EslamWael74 您通过 Java/Kotlin 代码中的绑定设置了 sale 的价值。类似 val binding = MyClassBinding.inflate(...),然后你可以调用 binding.sale = true。【参考方案4】:

类似于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_
    android:layout_
    android:visibility="@viewModel.number == 1" />

【讨论】:

以上是关于使用数据绑定设置视图可见性的主要内容,如果未能解决你的问题,请参考以下文章

将可见性属性(视图)与布尔属性(ViewModel)绑定

如何设置绑定到文本框的标签的可见性?

如何为 ListView 的 ContextActions 的 MenuItem 添加可见性绑定

为啥在使用传统绑定时 bool 可以在没有转换器的情况下为可见性工作

将 XAML 中的可见性绑定到可见性属性

如何使用 WPF 中的代码绑定 DataGridTextColumn 的可见性属性?