我正在使用MVVM和Databinding开发第一个Android应用程序。我正在掌握某些领域,但是我正在努力奋斗。情况:
我有一个“创建帐户”向导活动,该活动使用Android导航体系结构来浏览多个片段,以请求用户输入。第一个片段/步骤要求用户输入名字和姓氏。在两个字段中都输入内容之前,我不希望按钮继续进行下一步。我之前基于一个字段验证启用了按钮,但没有两个。我觉得我想念一些愚蠢的东西。
这是两个字段中都包含数据后我要启用的按钮:
<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) && safeUnbox(viewModel.lastNamesValid)}"
android:textAllCaps="false"
android:textColor="@{safeUnbox(viewModel.firstNamesValid) && 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) && safeUnbox(viewModel.lastNamesValid)}"
android:textColor="@{safeUnbox(viewModel.firstNamesValid) && 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
}
“有点”有效,但效果不佳。您可以基于通过数据绑定验证两个字段来启用按钮吗?我觉得有一种更简单的方法可以做到这一点。此设置的作用是,您填写了姓氏和名字,但没有任何反应,但是如果您导航回名字并输入另一个字符,它将起作用并启用按钮。我认为这是由于我的代码中的某些逻辑错误所致。感谢您的关注。
答案 0 :(得分:0)
最后我弄清楚了。打字可以帮助我发现问题,我将分享我为他人所做的事情。我的代码中引用了isNamesValid函数时出现逻辑错误。
我进行了以下更改:
isNamesValid现在使用一个字符串参数并检查特定的字符串,然后硬编码检查名字和姓氏值
var popupText = String(quakePoints[i][2]);
更新了转换以调用该方法,并传入要检查的名称。
var popupText = quakePoints[i][2].toString();