尝试将按钮的enabled属性绑定到Transformations.map。我不知道为什么它不起作用。我相信我正在做与本Google代码实验室完全相同的事情:https://codelabs.developers.google.com/codelabs/kotlin-android-training-quality-and-states/index.html?index=..%2F..android-kotlin-fundamentals#4
这就是我得到的:
private val loginFormState = MutableLiveData<LoginFormState>()
private var _username = ""
var username
get() = _username
set(value) {
if(value == _username) return
_username = value
validateFormState()
}
private var _password = ""
var password
get() = _password
set(value) {
if(value == _password) return
_password = value
validateFormState()
}
init {
_busy.value = false
}
val loginButtonEnabled: LiveData<Boolean> = Transformations.map(loginFormState) { it.isDataValid }
private fun validateFormState() {
val formState = LoginFormState()
formState.isUsernameValid = username.isNotEmpty()
formState.isPasswordValid = password.isNotEmpty()
loginFormState.value = formState
}
...
...
<Button
android:enabled="@{loginViewModel.loginButtonEnabled}"
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginStart="48dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="48dp"
android:layout_marginBottom="64dp"
android:onClick="@{() -> loginViewModel.onLogin()}"
android:text="@string/action_sign_in"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/password"
app:layout_constraintVertical_bias="0.2" />
...
非常感谢您的帮助!
答案 0 :(得分:1)
所以我才知道。我不知道为什么这样做有效,因为其他绑定在此之前就可以正常工作了,但是可以通过设置:
binding.lifecycleOwner = this
它开始工作。我最初没有设置它是因为我在一个Activity中而不是在Fragment中工作。如果有人知道为什么这使它起作用,将不胜感激!!