使用DataBinding时XML无法引用View.GONE/View.VISIBLE问题
DataBinding XML中无法直接使用View可见性常量问题修复
核心原因
DataBinding布局默认不会自动导入android.view.View类,直接在绑定表达式写View.GONE/View.VISIBLE会因类找不到编译失败。另外直接把ObservableBoolean实例放在三元表达式中判断,没有调用取值方法,也会触发类型不匹配错误。
解决方法
导入View类后直接使用常量
在布局的
<data>块中添加View的导入声明,即可在表达式中直接引用可见性常量,注意要调用get()方法获取ObservableBoolean存储的实际布尔值:<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="android.view.View" /> <variable name="viewModel" type="你的ViewModel全类名" /> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试文本" android:visibility="@{viewModel.observableBoolean.get() ? View.GONE : View.VISIBLE}" /> </layout>直接用常量对应整型值(无需导包)
不想额外导包可以直接写常量对应的int值,三个可见性常量对应关系为:
View.VISIBLE = 0、View.INVISIBLE = 4、View.GONE = 8,直接写数字即可:android:visibility="@{viewModel.observableBoolean.get() ? 8 : 0}"逻辑下沉到ViewModel(推荐写法)
不建议在XML中写业务判断逻辑,把可见性计算逻辑放到ViewModel层,XML只做纯绑定,后续维护改逻辑无需修改布局:
ViewModel侧代码:import android.view.View import androidx.databinding.BaseObservable import androidx.databinding.Bindable import androidx.databinding.ObservableBoolean class DemoViewModel : BaseObservable() { // 初始化直接传入初始值false,无需单独调用set赋值 val observableBoolean = ObservableBoolean(false) @get:Bindable val textVisibility: Int get() = if (observableBoolean.get()) View.GONE else View.VISIBLE // 布尔值变更时调用该方法,自动通知UI刷新 fun updateVisibleState(hideText: Boolean) { if (observableBoolean.get() != hideText) { observableBoolean.set(hideText) notifyPropertyChanged(BR.textVisibility) } } }布局侧直接绑定计算好的可见性值即可:
android:visibility="@{viewModel.textVisibility}"
内容的提问来源于stack exchange,提问作者bthayes1
相关产品推荐
相关产品推荐

