Android-以编程方式设置EditText字段后验证这些字段
在一个用于用户日志的片段中,我有两个Android-以编程方式设置EditText字段后验证这些字段,android,validation,android-edittext,sharedpreferences,Android,Validation,Android Edittext,Sharedpreferences,在一个用于用户日志的片段中,我有两个EditText小部件-一个用于电子邮件,另一个用于密码。当用户通过SharedReferences保存其凭据时,这些凭据将通过setText()以编程方式填充输入字段,如下所示: // obtain the credentials val email : String? = loginFragmentViewModel.retrieveEmailFromSharedPreferences() val password: String ? = loginFra
EditText
小部件-一个用于电子邮件,另一个用于密码。当用户通过SharedReferences
保存其凭据时,这些凭据将通过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)
}
}
如您所见,当输入出现任何错误时,我会通过EditText小部件的error
属性让用户知道。它们显示一个感叹号,通知用户输入不正确
我的问题是:
但是,如果像上面所看到的那样以编程方式设置输入,则这不起作用。这样设置之后,您仍然可以在EditText小部件的右侧看到感叹号,尽管给定的电子邮件和密码是正确的。当从SharedReferences
获得正确的电子邮件和密码,并且填写了EditText
字段时,看起来仍然是错误的。但事实并非如此
那么,我该如何解决这个问题呢
注意:我获取SharedReferences,这样用户就不必重新键入它们。so
loginDataChanged()
正在被调用,但分配给loginFormState
的观察者没有被调用?请确保在loginDataChanged()之前没有调用观察者。我有时观察到Love data observer在没有实际调用VM方法的情况下执行。您可以通过添加logs@MaithiliJoshi:谢谢你,那建议奏效了。
// 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)
}
})