I have a question about two-way data binidng implemented by MutableLiveData in ViewModel Class for and EditText.
If I define a LoginViewModel Class for a user, which is consisted of User, email and password as follows:
class LoginViewModel : ViewModel() {
val user = MutableLiveData<User>()
}
and
data class User(var email: String, var password: String)
when I rotate the phone (configuration changes occurs), the data entered will be gone.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="loginViewModel"
type="com.udacity.shoestore.screens.login.LoginViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/fragment_horizontal_margin"
android:paddingTop="@dimen/fragment_vertical_margin"
android:paddingRight="@dimen/fragment_horizontal_margin"
android:paddingBottom="@dimen/fragment_vertical_margin"
tools:context=".screens.login.LoginFragment">
<TextView
android:id="@+id/email_text"
style="@style/title_style"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_margin"
android:layout_marginStart="@dimen/medium_margin"
android:layout_marginEnd="@dimen/medium_margin"
android:text="@string/str_email"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/email_edit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/medium_margin"
android:layout_marginEnd="@dimen/medium_margin"
android:autofillHints=""
android:hint="@string/str_email_hint"
android:inputType="textEmailAddress"
android:text="@={loginViewModel.user.email}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/email_text" />
<TextView
android:id="@+id/password_text"
android:layout_width="0dp"
style="@style/title_style"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginStart="@dimen/medium_margin"
android:layout_marginEnd="@dimen/medium_margin"
android:text="@string/str_password"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/email_edit" />
<EditText
android:id="@+id/password_edit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/medium_margin"
android:layout_marginEnd="@dimen/medium_margin"
android:autofillHints=""
android:hint="@string/str_password_hint"
android:inputType="textPassword"
android:text="@={loginViewModel.user.password}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/password_text" />
<Button
android:id="@+id/sign_up_button"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginEnd="@dimen/small_margin"
android:text="@string/str_sign_up"
app:layout_constraintBaseline_toBaselineOf="@+id/sign_in_button"
app:layout_constraintEnd_toStartOf="@+id/sign_in_button"
app:layout_constraintStart_toStartOf="@+id/password_edit" />
<Button
android:id="@+id/sign_in_button"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginStart="@dimen/small_margin"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:text="@string/str_sign_in"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/password_edit"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/sign_up_button"
app:layout_constraintTop_toBottomOf="@+id/password_edit"
app:layout_constraintVertical_bias="0.524" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
I wonder if there is something wrong about defining the User data class or using it in ViewModel or something else, but it doesn't work.
On the other hand, if I define the elemnts of user seperately in ViewModel, it works:
class LoginViewModel : ViewModel() {
val email = MutableLiveData<String>()
val password = MutableLiveData<String>()
}
and of course some changes in xml:
android:text="@={loginViewModel.email}"
and
android:text="@={loginViewModel.password}"
any idea?