Как TextInoutLayout наблюдает значение String через привязку данных и Livedata из Viewmodel? - PullRequest
0 голосов
/ 12 июня 2019

Когда я пишу этот код с обычным editext, он работает нормально, когда я делаю с TextInputLayout / TextInputEditText, он не работает. Я хочу, чтобы поле ввода (EditText) наблюдало за строкой через привязку данных.

Я пытался проверить это через код и через xml

XML

<com.google.android.material.textfield.TextInputLayout
            android:id="@+id/new_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/new_passwod"
            android:layout_marginStart="20dp"
            android:layout_marginEnd="20dp"
            android:layout_marginTop="15dp"
            app:passwordToggleEnabled="true"

            >

    <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:text="@={changePasswordViewModel.newPassword}"
            app:onFocusChange="@{handler.newPasswordFocusChanged}"
            app:onTextChange="@{handler.passwordTextChanged}"
    />

ViewModel


//Fields
 val currentPassword = MutableLiveData<String>()
 val newPassword = MutableLiveData<String>()
 val confirmNewPassword = MutableLiveData<String>()

//Handler
inner class Handler {
val newPasswordFocusChanged = object : FocusChangedListener {
            override fun focusChanged(hasFocus: Boolean) {
                if (!hasFocus && !newPassword.value.validateRegex(accountFormConfiguration.getPasswordRegex())) {
                    _status.value = ModelEvent(ChangePasswordStatus.NewPasswordValidationError(errorMessage = accountFormConfiguration.getPasswordRegexError(), isErrorEnabled = true))
                } else {
                    _status.value = ModelEvent(ChangePasswordStatus.NewPasswordValidationError(null, isErrorEnabled = false))
                }
            }
        }
}

sealed class ChangePasswordStatus {
        data class NewPasswordValidationError(val errorMessage: String?, val isErrorEnabled: Boolean) : ChangePasswordStatus()
        data class ConfirmNewPasswordValidationError(val errorMessage: String) : ChangePasswordStatus()
        data class SamePasswordValidationError(val errorMessage: String) : ChangePasswordStatus()
        data class Failure(val errorMessage: String) : ChangePasswordStatus()
    }

// BindinigAdapter

@BindingAdapter("app:onFocusChange")
fun onFocusChange(text: EditText, focusChangedListener: FocusChangedListener) {
    text.onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus ->
        focusChangedListener.focusChanged(hasFocus)
    }
}

Просмотр статуса обработки

private fun handleStatus(status: ChangePasswordStatus?) {
        when(status) {
            is ChangePasswordStatus.NewPasswordValidationError -> {
                binding.newPassword.error = status.errorMessage
                binding.newPassword.isErrorEnabled = status.isErrorEnabled
            }

Функция расширения

fun String?.validateRegex(regex: String?): Boolean {
    if (this.isNullOrBlank() || regex.isNullOrBlank()) return false
    val pattern = Pattern.compile(regex)
    val matcher = pattern.matcher(this)
    return matcher.matches()
}

1 Ответ

0 голосов
/ 12 июня 2019

Вы сделали setLifecycleOwner () в привязке своего фрагмента?

...