#android #mvvm #android-databinding
#Android #mvvm #android-привязка данных
Вопрос:
мне нужно некоторое разрешение в моей концепции понимания реализации адаптера привязки.
Я разрабатываю форму входа в систему с двумя полями ввода и кнопкой. Я пытаюсь использовать адаптер привязки для проверки этих полей с помощью text watcher (который работает нормально).
Но я не понимаю, как я могу проверить эти поля одним нажатием кнопки. я пытаюсь добиться чистой архитектуры и удалить все виды зависимостей между view и ViewModel.
login_activity.xml
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="authModel"
type="com.jpm.ui.auth.AuthViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorSurface"
tools:context=".ui.auth.LoginActivty">
<androidx.appcompat.widget.AppCompatImageView
android:id="@ id/logo"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_marginTop="60dp"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/jpm_logo" />
<com.google.android.material.textfield.TextInputLayout
android:id="@ id/layoutLoginId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="40dp"
android:hint="@string/login_id_hint"
app:layout_constraintTop_toBottomOf="@id/logo"
app:startIconDrawable="@drawable/ic_user"
nullCheck="@{@string/nullError}">
<com.google.android.material.textfield.TextInputEditText
android:id="@ id/inputLoginId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={authModel.inputLoginId}" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@ id/layoutPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="40dp"
android:hint="@string/password"
app:layout_constraintTop_toBottomOf="@id/layoutLoginId"
app:passwordToggleEnabled="true"
app:startIconDrawable="@drawable/ic_locked">
<com.google.android.material.textfield.TextInputEditText
android:id="@ id/inputPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={authModel.inputPassword}" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@ id/btnSignIn"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginTop="30dp"
android:background="@drawable/bg_primary_rounded"
android:onClick="@{authModel::authClickListener}"
android:paddingStart="40dp"
android:paddingEnd="40dp"
android:text="@string/sign_in"
android:textColor="@color/textSecondary"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/layoutPassword" />
<com.google.android.material.textview.MaterialTextView
android:id="@ id/labelCreateAccount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/don_t_have_an_account"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/txtCreateAccount"
app:layout_constraintTop_toBottomOf="@id/btnSignIn" />
<com.google.android.material.textview.MaterialTextView
android:id="@ id/txtCreateAccount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginTop="20dp"
android:onClick="@{authModel::authClickListener}"
android:text="@string/create_account"
android:textColor="@color/colorPrimary"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintLeft_toRightOf="@id/labelCreateAccount"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnSignIn" />
<com.google.android.material.textview.MaterialTextView
android:id="@ id/txtSkip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{authModel::authClickListener}"
android:text="@string/skip"
android:textColor="@color/textGrey"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/txtCreateAccount" />
</androidx.constraintlayout.widget.ConstraintLayout>
ValidationUtils.class
import android.util.Log
import androidx.core.widget.doAfterTextChanged
import androidx.databinding.BaseObservable
import androidx.databinding.Bindable
import androidx.databinding.BindingAdapter
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.google.common.base.Predicates
import com.jpm.R
object ValidationUtils : BaseObservable() {
const val TAG = "VALIDATION"
@BindingAdapter("nullCheck")
@JvmStatic
fun setError(inputLayout: TextInputLayout, errorMsg: String) {
inputLayout.editText?.doAfterTextChanged {
if (it.isNullOrEmpty()) {
inputLayout.isErrorEnabled = true
inputLayout.error = errorMsg
} else {
inputLayout.isErrorEnabled = false
inputLayout.error = null
}
}
}
}
Пожалуйста, помогите с каким-либо предложением или что я могу реализовать для достижения проверки при нажатии кнопки.
** Проверка PS- On при нажатии кнопки setError
EditText
также должна применяться **
Ответ №1:
Это то, что я бы использовал в вашем случае:
Когда вызывается ваша ViewModel authClickListener()
, вы проверяете / проверяете каждый ввод, который связан с двусторонней привязкой данных, в вашем случае inputLoginId
и password
.
Кроме того, вы настраиваете две наблюдаемые ошибки с типом String?
, привязкой к error
соответствующему TextInputLayout
и просто изменяете сообщения об ошибках в соответствии с вашей логикой проверки
Комментарии:
1. Хорошо, будем думать так