Android 两个或多个字段启用按钮的数据绑定 TextEdit 验证

Android Databinding TextEdit Validation of two or more fields enable button

我正在使用 MVVM 和数据绑定开发我的第一个 Android 应用程序。我正在掌握一些领域,但我正在努力解决这个问题。场景:

我有一个创建帐户向导 activity,它使用 Android 导航架构来翻阅几个片段,要求用户输入。第一个 fragment/step 询问用户的名字和姓氏。在两个字段中都输入内容之前,我不希望按钮继续下一步以启用。我之前启用了基于一个字段验证的按钮,但不是两个。我觉得我错过了一些愚蠢的东西。

这是我想要在两个字段中都有数据后启用的按钮:

<Button
android:id="@+id/continueToSecondStepButton"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:background="@drawable/button_transparent_background"
android:onClick="@{() -> viewModel.proceedToNextStep()}"
android:text="@string/step_proceed"
android:enabled="@{safeUnbox(viewModel.firstNamesValid) &amp;&amp; safeUnbox(viewModel.lastNamesValid)}"
android:textAllCaps="false"
android:textColor="@{safeUnbox(viewModel.firstNamesValid) &amp;&amp; safeUnbox(viewModel.lastNamesValid) ? @colorStateList/white : @colorStateList/transparent_white}"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/subtext" />

这里主要是重点:

 android:enabled="@{safeUnbox(viewModel.firstNamesValid) &amp;&amp; safeUnbox(viewModel.lastNamesValid)}"
 android:textColor="@{safeUnbox(viewModel.firstNamesValid) &amp;&amp; safeUnbox(viewModel.lastNamesValid) ? @colorStateList/white : @colorStateList/transparent_white}"

我有两个转换来监听名字和姓氏字段的关键变化并执行验证方法:

    firstNamesValid = Transformations.switchMap(firstName) { firstName -> isNamesValid() }

    lastNamesValid = Transformations.switchMap(lastName) { lastName -> isNamesValid() }

现在,只是一个简单的方法来检查两个字段中是否都有数据:

 private fun isNamesValid(): LiveData<Boolean> {
    var namesValid = false

    if (!firstName.value.isNullOrEmpty() && !lastName.value.isNullOrEmpty()) {
        namesValid = true
    }

    val mediatorLiveData: MediatorLiveData<Boolean> = MediatorLiveData()
    mediatorLiveData.value = namesValid
    return mediatorLiveData
}

它"kind of" 有效但效果不佳。您可以基于使用数据绑定验证两个字段来启用按钮吗?我觉得有一种更简单的方法可以做到这一点。此设置发生的情况是,您填写名字和姓氏,但没有任何反应,但如果您随后导航回名字并输入另一个字符,它会起作用并启用按钮。我认为这是由于我的代码中存在一些逻辑错误。感谢观看。

我很快就弄明白了。输入它帮助我找到了问题,我将分享我为其他人所做的事情。我在引用 isNamesValid 函数的代码中出现逻辑错误。

我做了以下修改:

isNamesValid 现在采用字符串参数并检查特定字符串,而不是硬编码检查名字和姓氏值

private fun isNameValid(name: String?): LiveData<Boolean> {
    var namesValid = false

    if (!name.isNullOrEmpty()) {
        namesValid = true
    }

    val mediatorLiveData: MediatorLiveData<Boolean> = MediatorLiveData()
    mediatorLiveData.value = namesValid
    return mediatorLiveData
}

更新了转换以调用传递要检查的名称的方法。

    firstNamesValid = Transformations.switchMap(firstName) { firstName -> isNameValid(firstName) }

    lastNamesValid = Transformations.switchMap(lastName) { lastName -> isNameValid(lastName) }