#android #kotlin #fragment
Вопрос:
Я пытаюсь заставить свой фрагмент регистрации показывать ошибку, если пароли не совпадают, но я вижу только ошибку, которая запрашивает буквенно-цифровые символы (но даже если я наберу это, похоже, не работает). Что я делаю не так?
Это модель представления, в которой я настраиваю условия для возникновения ошибки, если они не выполняются:
class SignUpViewModel(private val signUpRepository: SignUpRepository) : ViewModel() {
private val _signUpForm = MutableLiveData<SignUpFormState>()
val signUpFormState: LiveData<SignUpFormState> = _signUpForm
fun signUp(name: String, email:String, password: String) {
}
fun signUpDataChanged(email:String, password: String, confirmPassword: String) {
if (!isEmailValid(email)) {
_signUpForm.value = SignUpFormState(emailError = R.string.invalid_email)
} else if (!isPasswordValid(password)) {
_signUpForm.value = SignUpFormState(passwordError = R.string.invalid_password_signUp)
} else if (!passwordsMatch(password,confirmPassword)){
_signUpForm.value = SignUpFormState(confirmPasswordError = R.string.mismatched_password)
}
else {
_signUpForm.value = SignUpFormState(isDataValid = true)
}
}
// A placeholder username validation check
private fun isEmailValid(email: String): Boolean {
return if (email.contains('@')) {
Patterns.EMAIL_ADDRESS.matcher(email).matches()
} else {
email.isNotBlank()
}
}
// A placeholder password validation check
private fun isPasswordValid(password: String): Boolean {
return password.contains("^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9] $")
}
//check if passwords are the same
private fun passwordsMatch(password: String, confirmPassword:String): Boolean{
return password == confirmPassword
}
}
Это фрагмент:
class SignUpFragment : Fragment() {
private lateinit var binding: FragmentSignupBinding
private lateinit var signUpViewModel: SignUpViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentSignupBinding.inflate(inflater, container, false)
val nameInput = binding.etName
val emailInput = binding.etEmail
val passwordInput = binding.etPassword
val confirmPasswordInput = binding.etConfirmPassword
val signupButton = binding.btSignUp
signUpViewModel = ViewModelProvider(this, SignUpViewModelFactory())
.get(SignUpViewModel::class.java)
signUpViewModel.signUpFormState.observe(viewLifecycleOwner, Observer {
val signUpState = it ?: return@Observer
// disable sign up button unless fields are valid
signupButton.isEnabled = signUpState.isDataValid
if (signUpState.emailError != null) {
emailInput.error = getString(signUpState.emailError)
}
if (signUpState.passwordError != null) {
passwordInput.error = getString(signUpState.passwordError)
}
if (signUpState.confirmPasswordError != null) {
confirmPasswordInput.error = getString(signUpState.confirmPasswordError)
}
})
emailInput.afterTextChanged {
signUpViewModel.signUpDataChanged(
emailInput.text.toString(),
passwordInput.text.toString(),
confirmPasswordInput.text.toString()
)
}
passwordInput.afterTextChanged {
signUpViewModel.signUpDataChanged(
emailInput.text.toString(),
passwordInput.text.toString(),
confirmPasswordInput.text.toString()
)
}
confirmPasswordInput.apply {
afterTextChanged {
signUpViewModel.signUpDataChanged(
emailInput.text.toString(),
passwordInput.text.toString(),
confirmPasswordInput.text.toString()
)
}
setOnEditorActionListener { _, actionId, _ ->
when (actionId) {
EditorInfo.IME_ACTION_DONE ->
signUpViewModel.signUp(
emailInput.text.toString(),
passwordInput.text.toString(),
confirmPasswordInput.text.toString()
)
}
false
}
}
return binding.root
}
}
fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) {
this.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(editable: Editable?) {
afterTextChanged.invoke(editable.toString())
}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
})
}
Ответ №1:
String.contains
соответствует подстроке, а не регулярному выражению , для использования в регулярных выражениях
val regex = Regex("^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9] $")
assertTrue(regex.containsMatchIn("xabcdy"))
- Для вашей функции сопоставления сначала попробуйте войти в систему , а затем используйте
String.trim()
для неожиданных пробелов.