Android: двусторонняя привязка данных к объекту, расширяющему представление - PullRequest
0 голосов
/ 19 октября 2018

У меня проблемы при попытке сделать двустороннюю привязку данных с моим классом Editor (в модели).Этот объект расширяет View и вызывается прямо в макете.Проблема в том, как мне добиться двухстороннего связывания данных, чтобы при изменении редактора в EditionViewModel оно также менялось в представлении?(Мой классный редактор представляет Canvas, на котором можно рисовать)

Вот мой код EditionViewModel:

public class EditionViewModel extends ViewModel {
private Editor editor;
private User user;
private SocketService socketService;
private EditionErrorHandler editionErrorHandler;

public EditionViewModel(User user, SocketService socketService, EditionErrorHandler editionErrorHandler, Editor editor) {
    this.user = user;
    this.socketService = socketService;
    this.editionErrorHandler = editionErrorHandler;
    this.editor = editor;
}


public Editor getEditor() {
    return editor;
}

public void setEditor(Editor editor) {
    this.editor = editor;
}

public void onPenClicked(View view){
    editor.normal();
}

public void onPenEraserClicked(View view){
    editor.eraser();
}

Вот EditionActivity:

public class EditionActivity extends AppCompatActivity implements EditionErrorHandler {

private Editor edition;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActivityEditionBinding activityEditionBinding = DataBindingUtil.setContentView(this, R.layout.activity_edition);
    edition = (Editor) findViewById(R.id.edition);
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    edition.init(metrics);
    activityEditionBinding.setViewModel(ViewModelProviders.of(
            this,
            new EditionViewModelFactory(null, null, this, edition))
            .get(EditionViewModel.class));

}

И, наконец, здесьэто макет edition_activity:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">

<data>
    <variable
        name="viewModel"
        type="ca.polymtl.equipe5.polypaint.viewmodel.EditionViewModel" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ca.polymtl.equipe5.polypaint.view.EditionActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:background="#aea1a1">
        <Button
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:drawableTop="@drawable/crayon"
            android:onClick="@{viewModel::onPenClicked}" />
        </LinearLayout>
    <ca.polymtl.equipe5.polypaint.model.Editor
        android:id="@+id/edition"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
        <!--android:src="@={viewModel.Editor}"-->
        />
</LinearLayout>

Интересная часть находится в ca.polymtl.equipe5.polypaint.model.Editor TAG.На этом этапе, как я могу добиться двухсторонней привязки данных, чтобы мой объект Editor был таким же, как объект Editor EditionViewModel?(Я сделал неудачную попытку с android: src = "@ = {viewModel.Editor}" и, найдя редактор, напрямую используя его идентификатор в Edition_Activity)

Спасибо за любую помощь, которую вы можете предоставить.

...