使用可观察布尔值设置android视图的可见性

使用可观察布尔值设置android视图的可见性,android,android-view,android-databinding,Android,Android View,Android Databinding,这是关于一些我在代码审查中一直争论的非常琐碎的事情。情况就是这样。有一个数据绑定布局:some_layout.xml,由一个ViewModel支持 [部分_layout.xml的内容] <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/

这是关于一些我在代码审查中一直争论的非常琐碎的事情。情况就是这样。有一个数据绑定布局:
some_layout.xml
,由一个
ViewModel
支持

[部分_layout.xml的内容]

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <import type="android.view.View"/>
        <variable name="viewModel" type="some.long.package.name.SomeViewModel"/>
    </data>

    <!-- Other stuffs -->

    <TextView
        <!-- Other parameters-->>
        android:visibility="@{viewModel.someObservableBool?View.VISIBLE : View.GONE}"
    />
</layout>

我的理解不正确吗?

java中没有隐式类型转换,整数值不被解释为布尔值——这意味着如果您编写

 <TextView
        <!-- Other parameters-->>
        android:visibility="@{viewModel.someObservableBool}"
    />

它应该会起作用。您可以查看相关文档

为什么不让审核人澄清一下——这就是审核的重点——打开一个对话框。就个人而言,xml不应该有表示逻辑,IMO的约定是ViewModel`应该是视图状态的1:1表示,在本例中,它不是。我完全同意,但由于某些不幸的原因,这是一个审查迭代,其中每个参数都在以下点结束——“请这样做,因为这是我们大家都同意的惯例,如果你认为这太可怕了,请在适当的房间提出你的担忧“。我只是担心我对布尔到整数转换的理解是否正确。当然-我认为该约定也可以讨论,不应该一成不变,随着时间的推移,最佳实践可能会改变/更新。”。对于这一特定问题,您应该询问审稿人,以供参考,该约定在视图状态为
view.GONE
view.VISIBLE
时使用。对我来说,我会直接向视图提供
int
值,而不是
布尔值,因为可见性是三态的,正如你指出的那样。谢谢你的回复,听起来更理智!我最初创建了一个
enum
,以反映可见性状态(考虑到更可读的形式),而不是传递一个原始的int。但是我不得不辞职,因为有人担心这样的事情太复杂了。哦,但是
android:visibility=“@{viewModel.someobservebool}”
这不会在
数据绑定编译器编译时出错。我不完全确定其原因,看起来在生成的绑定代码中发生了一些转换。顺便说一句,谢谢你的回复!你能编译stacktrace吗?我想更正一下,在一个公共模块中实现了一个通用的
BindingAdapter
[
@BindingAdapter(“android:visibility”)fun TextView.setVisibility(b:Boolean)=if(b)View.VISIBLE else View.go
]。生成的数据绑定代码正在使用
boolean
参数调用该代码。
 <TextView
        <!-- Other parameters-->>
        android:visibility="@{viewModel.someObservableBool}"
    />
@BindingConversion
fun booleanToVisibility(value: Boolean?) = if (value == true)View.VISIBLE else View.GONE