как изменить значение компонента пользовательского интерфейса через связанную переменную в ViewModel - PullRequest
0 голосов
/ 05 января 2019

Я учусь, как разрабатывать, используя MVVM. Я создал небольшой пример, как показано ниже в коде. Я хочу изменить значение TextView при нажатии кнопки пользовательского интерфейса. изначально TextView установлен на пустую строку.

В xml-файле пользовательский интерфейс TextView привязан к переменной «result» в Viewmodel, изначально эта переменная «result» установлена ​​в «». Что я хочу сделать, это когда пользователь нажимает кнопку, переменная «результат» будет иметь другое значение, и я хочу установить это значение для TextView.

Пожалуйста, дайте мне знать, как мне этого добиться.

XML

<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/tools">

<data>
    <!-- the class the behaves as Viewmodel and contains the @Bindable Object-->
    <variable
        name="vm1"
        type="com.example.amrbakri.mvvm_02.LoginViewModel1" />
</data>


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/actMain_LoginViewModel1_tv_results"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:text="@{vm1.result}"
        />
</LinearLayout>
</layout>

ViewModel

public class LoginViewModel1 extends BaseObservable {
private final static String TAG = LoginViewModel1.class.getSimpleName();
private final static String MSG_ON_OBSERVATION_RESULTS_SUCCESSFUL = "observation results successful";
private final static String MSG_ON_OBSERVATION_RESULTS_FAILED = "observation results failed";

private String mUserId = null;
private String mUserPass = null;
private UserModel mUserModel = null;

public String result = " ";

public LoginViewModel1() {
    this.mUserModel = new UserModel("", "");
}

public void onLoginUser1Clicked() {
    Log.d(TAG, "onLoginUser1Clicked");
    this.result = "result";
    Log.d(TAG, "onLoginUser1Clicked result: " + this.result);
}
}

1 Ответ

0 голосов
/ 05 января 2019

При использовании DataBinding без каких-либо ObservableField или LiveData

вам необходимо ' уведомить об изменении данных '.

т.е. notifyPropertyChanged(BR.vm1)).

Так что-то вроде:

public void onLoginUser1Clicked() {
    Log.d(TAG, "onLoginUser1Clicked");
    this.result = "result";
    Log.d(TAG, "onLoginUser1Clicked result: " + this.result);
    notifyPropertyChanged(BR.vm1)); // This will notify data and update UI.
}
...