Я хочу настроить видимость ProgressBar в зависимости от переменной MutableLiveData в моей модели представления.Я узнал, что 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
работает, но видимость индикатора загрузкине меняется (из ушедшего в видимое).Как я могу это исправить и, возможно, избавиться от двух переменных и иметь только одну?
Спасибо.