Android-以编程方式设置后验证EditText字段

问题描述

一个用于用户登录的片段上,我有两个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 (将#修改为@)