如何解决如何通过 DataBinding 设置 ConstraintLayout 组的可见性?
我的布局中有 2 个 Group
来控制我的视图的可见性。
但是,我无法通过 DataBinding 设置它们的可见性:
<layout>
<data>
<import type="android.view.View"/>
<variable
name="viewModel"
type="co.aresid.book13.fragments.trackinglist.TrackingListViewModel"
/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout>
...
<androidx.constraintlayout.widget.Group
android:id="@+id/content_group"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="@{viewModel.hideLoadingAndShowContent ? View.VISIBLE : View.GONE,default=gone}"
app:constraint_referenced_ids="tracking_list_recycler_view"
/>
<androidx.constraintlayout.widget.Group
android:id="@+id/loading_group"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="@{viewModel.hideLoadingAndShowContent ? View.GONE : View.VISIBLE,default=visible}"
app:constraint_referenced_ids="progress_circular"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
hideLoadingAndShowContent
变量是一个 LiveData
,它从我的 MutableLiveData
中的相应 ViewModel
获取其值:
private val _hideLoadingAndShowContent = MutableLiveData<Boolean>()
val hideLoadingAndShowContent: LiveData<Boolean>
get() = _hideLoadingAndShowContent
此 LiveData
仅在 ViewModel
中设置,不会出现在 Fragment
类中。
在 Fragment
类中,我还设置了 binding.lifecycleOwner
:
binding.lifecycleOwner = viewLifecycleOwner
我遗漏了什么细节?
解决方法
我忘记将 ViewModel
传递给我的 Fragment
类中的布局绑定:
binding.viewModel = viewModel
,
因为android:visibility
不支持绑定变量观察,
您可以通过这种方式创建 BindingAdapter
@BindingAdapter("mutableVisibility")
fun setMutableVisibility(view: View,visibility: MutableLiveData<Boolean>) {
val owner = (view.getParentActivity() ?: view.context) as LifecycleOwner
if (owner != null) {
visibility.observe(
owner,Observer { value ->
view.visibility = if(value) View.VISIBLE else View.GONE
})
}
}
用于从视图中获取活动的实用函数。
fun View.getParentActivity(): AppCompatActivity?{
var context = this.context
while (context is ContextWrapper) {
if (context is AppCompatActivity) {
return context
}
context = context.baseContext
}
return null
}
然后在你的 XML 中你可以这样做
<androidx.constraintlayout.widget.Group
android:id="@+id/content_group"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="@{viewModel.hideLoadingAndShowContent}"
app:constraint_referenced_ids="tracking_list_recycler_view"
/>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。