Простая архитектура MVVM на Android с AndroidX на Java - PullRequest
0 голосов
/ 04 февраля 2020


Я становлюсь очень раздраженным, пытаясь понять, как фрик создает простой паттерн MVVM Android активность.

Мне нужно просто связать метод представления модели publi c (( который печатает журнал "Eureka!") на кнопку (с действием onClick).


Чтобы добиться этого, с тех пор я сделал следующее:

data_activity. xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="it.XXXXX.XXXXX.ui.data.DataActivity"
    >

    <data>
        <variable
            name="viewModel"
            type="it.XXXXX.XXXXX.ui.data.DataViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

            <TextView
                android:id="@+id/some_useless_id_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:textAppearance="@style/TextAppearance.AppCompat.Body1"
                tools:text="Press this beautiful button ;)" />

            <Button
                android:id="@+id/some_useless_id_2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="@{() -> viewModel.test()}"
                android:text="@string/button" />
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

DataViewModel. java

package it.XXXXX.XXXXX.ui.data;

import android.util.Log;

import androidx.lifecycle.ViewModel;

public class DataViewModel extends ViewModel {
    public void test() {
        Log.d("test", "EUREKA!");
    }
}

DataActivity. java

package it.XXXXX.XXXXX.ui.data;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;

import it.XXXXX.XXXXX.R;

public class DataActivity extends AppCompatActivity {

    private DataViewModel mViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.data_activity);
        this.mViewModel = new ViewModelProvider(this).get(DataViewModel.class);
    }
}

... наконец (поскольку я работаю над существующим приложением) я вызываю View с помощью:

...
        ((Button)this.findViewById(R.id.btnDataSync2)).setOnClickListener(new OnClickListener(){
            public void onClick(View arg0) {
                Intent i = new Intent(MainActivity.this, DataActivity.class);
                MainActivity.this.startActivity(i);
            }
        });
...

Ожидаемое поведение - читать журнал, нажимая на DataView (который загружен), но ничего происходит (кроме анимации нажатия кнопки).

Кто-нибудь знает, в чем может быть проблема?
Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Шаг для включения привязки данных в приложении Android:

  1. добавьте android.databinding.enableV2=true в ваш файл "gradle.properties";

  2. добавить dataBinding { enabled = true } в файл приложения "build.gradle", в разделе android:

android {
    compileSdkVersion 28

    ...

    dataBinding {
        enabled = true
    }
}
запустить синхронизацию gradle c и встроить Android Studio.

Обновление

Я забыл сказать, что вы должны изменить свой onCreate такой метод:

package it.XXXXX.XXXXX.ui.data;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;

import android.os.Bundle;

import it.XXXXX.XXXXX.R;
import it.XXXXX.XXXXX.databinding.DataActivityBinding;

public class DataActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        DataViewModel mViewModel = new DataViewModel();

        DataActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.data_activity);
        binding.setViewModel(mViewModel);
    }
}
0 голосов
/ 04 февраля 2020

Я полагаю, что я не правильно связывал ViewModel с Activity:


DataActivity. java

public class DataActivity extends AppCompatActivity {

    private DataViewModel mViewModel;
    private DataActivityBinding mBinding;

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

        this.mViewModel = new DataViewModel();
        this.mBinding = DataBindingUtil.setContentView(this, R.layout.data_activity);
        this.mBinding.setViewModel(this.mViewModel);
    }
}



надеюсь, это кому-нибудь поможет.



Ps. спасибо @ medaip90 за полезный совет!

...