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)
       }
})