问题描述
在一个用于用户登录的片段上,我有两个EditText
小部件-一个用于电子邮件,另一个用于密码。当用户通过SharedPreferences
保存其凭据时,将通过setText()
以编程方式获取这些凭据以填充输入字段,如下所示:
// obtain the credentials
val email : String? = loginFragmentviewmodel.retrieveEmailFromSharedPreferences()
val password: String ? = loginFragmentviewmodel.retrivePasswordFromSharedPreferences()
email?.let { emailString->
password?.let{ pw ->
// fill the EditText inputs programmatically
binding.apply{
loginEmail.setText(emailString)
loginPassword.setText(pw)
}
// validate the input data
loginFragmentviewmodel.loginDataChanged(
binding.loginEmail.text.toString(),binding.loginPassword.text.toString()
)
}
}
loginDataChanged()
方法在viewmodel端实现。它验证给定的输入(这里:电子邮件和密码)。这里是相关部分:
private val _loginState = mutablelivedata<LoginFormState>()
val loginFormState : LiveData<LoginFormState> = _loginState
fun loginDataChanged(email: String,password: String){
if(!isEmailValid(email)){
_loginState.value = LoginFormState(emailError = R.string.invalid_email)
}
else if(!isPasswordValid(password)){
_loginState.value = LoginFormState(passwordError = R.string.invalid_password)
}
else{
_loginState.value = LoginFormState(isDataValid = true)
}
}
如您所见,基于验证结果,我们更新了LiveData变量,该变量将我们带回到LoginFragment
端:
// listen for type errors made by the user during the login
loginFormState.observe(viewLifecycleOwner,Observer { loginFormState ->
...
...
// notify the user that the given email is wrong
loginFormState.emailError?.let{
binding.loginEmail.error = getString(it)
}
// notify the user that the given password is wrong
loginFormState.passwordError?.let{
binding.loginPassword.error = getString(it)
}
})
如您所见,当输入出现任何错误时,我会通过EditText小部件的error
属性让用户知道。它们显示一个感叹号,通知用户输入不正确。
我的问题是:
但是,当像上面所看到的那样以编程方式设置输入时,这将不起作用。像这样设置它们之后,您仍然可以在EditText小部件 ALTHOUGH 右侧看到感叹号,因为给定的电子邮件和密码正确无误。从SharedPreferences
获得正确的电子邮件和密码,并且填写了EditText
字段后,看起来还是错误的。但事实并非如此。
那么,我该如何解决这个问题?
注意:我获得了SharedPreferences,以便用户不必重新键入它们。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)