如何通过BindingAdapter结合ViewModel函数返回值切换视图可见性
问题修复:BindingAdapter无法根据ViewModel函数切换视图可见性
核心问题点
- 绑定表达式名称不匹配 + 函数调用语法错误
布局中写的viewModel.lastDutyDay和ViewModel里的isLastDutyDay()名称不一致,且Data Binding调用函数必须加括号。 - Fragment未将ViewModel实例绑定到布局变量
布局声明了viewModel变量,但Fragment没有把创建好的ViewModel实例赋值给它,导致布局无法获取数据。
分步修复
1. 修正布局中的绑定表达式
修改custom_row.xml里的app:visibleGone属性:
<LinearLayout android:id="@+id/footer_layout" android:layout_width="match_parent" android:background="@color/md_theme_light_surfaceTint" app:visibleGone="@{viewModel.isLastDutyDay()}" android:orientation="vertical">
2. 在Fragment中绑定ViewModel到布局
修改ListFragment.kt的onCreateView方法,添加ViewModel赋值代码:
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { setHasOptionsMenu(true) _binding = FragmentListBinding.inflate(inflater, container, false) _binding?.lifecycleOwner = viewLifecycleOwner // 新增:将ViewModel实例绑定到布局变量 _binding?.viewModel = viewModel return binding.root }
(可选)支持动态更新可见性
如果后续需要根据数据变化动态切换可见性,建议把ViewModel中的函数改成LiveData:
// ViewModel.kt val isLastDutyDay = MutableLiveData(true)
对应的布局绑定表达式改成(不需要括号,Data Binding会自动观察LiveData变化):
app:visibleGone="@{viewModel.isLastDutyDay}"
额外验证点
确保你的项目已经启用Data Binding:在模块级build.gradle中添加配置:
android { ... buildFeatures { dataBinding true // 如果用ViewBinding可以同时开启:viewBinding true } }
内容的提问来源于stack exchange,提问作者Marcel Fuchs
相关产品推荐
相关产品推荐

