我想根据我的视图模型中的MutableLiveData变量来调整ProgressBar的可见性。我了解到MutableLiveData无法正常工作,因此我需要一个LiveData变量来对其进行转换。有点奇怪,但是至少它应该可以正常工作吗?
现在它不起作用。而且我不明白为什么我想让两个变量做一件事。
我希望代码能说明一切:
活动:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityLoginBinding = DataBindingUtil.setContentView(this, R.layout.activity_login)
binding.lifecycleOwner = this
binding.viewmodel = vm
}
查看模型:
class LoginViewModel : ViewModel() {
var isLoading: MutableLiveData<Boolean> = MutableLiveData(false)
var showLoadingIndicator: LiveData<Boolean> = Transformations.map(isLoading) { isLoading.value }
fun login() {
Timber.d("login")
isLoading.value = true
}
}
布局:
<?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">
<data>
<variable
name="viewmodel"
type="mypackage.LoginViewModel"/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.button.MaterialButton
android:onClick="@{() -> viewmodel.login()}"/>
<include
layout="@layout/loading_indicator"
app:goneUnless="@{viewmodel.showLoadingIndicator}"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
BindingAdapter:
@Suppress("unused")
object BindingAdapters {
@BindingAdapter("goneUnless")
@JvmStatic
fun goneUnless(view: View, visible: Boolean) {
view.visibility = if (visible) View.VISIBLE else View.GONE
}
}
当我单击按钮时,Timber
调用起作用了,但是加载指示器的可见性没有改变(从变为可见)。我该如何解决这个问题,也许摆脱两个变量而只有一个?
谢谢。
答案 0 :(得分:1)
您实际上不需要BindingAdapter
,有一种更简单的方法来完成您想要的事情。
1)ViewModel:将您的加载字段更改为:val isLoading = ObservableBoolean()
2)在布局的<data>
标签内添加导入:<import type="android.view.View"/>
3)您的包含将变为:
<include
layout="@layout/loading_indicator"
android:visibility="@{viewmodel.isLoading ? View.VISIBLE : View.GONE}"/>
使用set(value)
更改ObservableBoolean
的值