Android: 如何通过DataBinding 绑定ProgressBar 可见性?
Android: How to bind ProgressBar visibility via DataBinding?
老实说,我已经尝试了很多,但都没有成功。
我在构造函数中有一个 HomeViewModel
和一些数据:
class HomeViewModel(
val userName: MutableLiveData<String> = MutableLiveData(),
val userAvatar: MutableLiveData<String> = MutableLiveData(),
// ...
val showProgressBarUserInfo: MutableLiveData<Boolean> = MutableLiveData()
) : BaseViewModel() {
HomeViewModel
中的函数 saveUserInfo()
private fun saveUserInfo(user: User) {
showProgressBarUserInfo.value = true
getSomeOtherData()
showProgressBarUserInfo.value = false
}
其中函数getSomeOtherData()
还加载了用户名和头像,也绑定了
<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="vm"
type="/path/to/HomeViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
// ...
android:visibility="@{vm.showProgressBarUserInfo ? View.VISIBLE : View.GONE}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
我还尝试创建一个函数 setVisibleOrGone()
(扩展与否)
fun View.setVisibleOrGone(bool: Boolean) {
if (bool) {
this.visibility = View.VISIBLE
} else {
this.visibility = View.GONE
}
}
使用@BindingAdapter("showOrHide") 注释并像使用它一样
showOrHide="@{vm.showProgressBarUserInfo}"
但以上都不起作用。
P.S.用户名和头像数据绑定成功,但进度条不显示。
P.S.S. 工具栏标题和 ImageView:
app:title="@{vm.userName}"
loadAvatar="@{vm.userAvatar}"
其中loadAvatar
是扩展函数
请帮帮我
在我的例子中,当用户进入应用程序时,我加载了一些数据,此时进度条应该是可见的。
我也用了一个Koin,HomeViewModel是通过它分别初始化的,变量showProgressBarUserInfo的默认值为“false”。
显然,在进入saveUserInfo()
函数的那一刻,getSomeOtherData()
函数的调用执行得太快了,ProgressBar的状态切换是看不见的。
我通过添加
解决了我的问题
init {
showProgressBarUserInfo.value = true
}
在我的 HomeViewModel
和
的顶部
android:visibility="@{vm.showProgressBarUserInfo ? View.VISIBLE : View.GONE}"
老实说,我已经尝试了很多,但都没有成功。
我在构造函数中有一个 HomeViewModel
和一些数据:
class HomeViewModel(
val userName: MutableLiveData<String> = MutableLiveData(),
val userAvatar: MutableLiveData<String> = MutableLiveData(),
// ...
val showProgressBarUserInfo: MutableLiveData<Boolean> = MutableLiveData()
) : BaseViewModel() {
HomeViewModel
中的函数saveUserInfo()
private fun saveUserInfo(user: User) {
showProgressBarUserInfo.value = true
getSomeOtherData()
showProgressBarUserInfo.value = false
}
其中函数getSomeOtherData()
还加载了用户名和头像,也绑定了
<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="vm"
type="/path/to/HomeViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
// ...
android:visibility="@{vm.showProgressBarUserInfo ? View.VISIBLE : View.GONE}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
我还尝试创建一个函数 setVisibleOrGone()
(扩展与否)
fun View.setVisibleOrGone(bool: Boolean) {
if (bool) {
this.visibility = View.VISIBLE
} else {
this.visibility = View.GONE
}
}
使用@BindingAdapter("showOrHide") 注释并像使用它一样
showOrHide="@{vm.showProgressBarUserInfo}"
但以上都不起作用。
P.S.用户名和头像数据绑定成功,但进度条不显示。
P.S.S. 工具栏标题和 ImageView:
app:title="@{vm.userName}"
loadAvatar="@{vm.userAvatar}"
其中loadAvatar
是扩展函数
请帮帮我
在我的例子中,当用户进入应用程序时,我加载了一些数据,此时进度条应该是可见的。
我也用了一个Koin,HomeViewModel是通过它分别初始化的,变量showProgressBarUserInfo的默认值为“false”。
显然,在进入saveUserInfo()
函数的那一刻,getSomeOtherData()
函数的调用执行得太快了,ProgressBar的状态切换是看不见的。
我通过添加
解决了我的问题init {
showProgressBarUserInfo.value = true
}
在我的 HomeViewModel
和
android:visibility="@{vm.showProgressBarUserInfo ? View.VISIBLE : View.GONE}"