MVVM+hilt+LiveDataを使ったシンプルなアプリ(java)


# 概要
- ボタンを押すとAとBが切り替わるだけのアプリです.
- MVVM+hilt+LiveDataを使っています。
- Model側の値更新を元にViewを更新します。
- javaです。

![スクリーンショット 2022-05-27 14.25.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132514/daa6da1c-58aa-842b-b699-6c26b88fc08a.png)

# 構成
- MainActivity : 画面描画とボタン押下時のイベント定義等
- SampleDataModel : testValueを管理するだけのクラス
- SampleDataViewModel : シンプルなviewModel
※SampleDataModelのtestValueが真ならばA, 偽ならばBを画面に表示することを想定しています

```mermaid
flowchart
SampleDataViewModel -- Inject --> MainActivity 
SampleDataModel -- Inject --> SampleDataViewModel
```

# activity_main.xml
layout xmlファイルは以下のとおりです。
```xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="A"
        android:textSize="34sp"/>
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />
</LinearLayout>
```


# SampleDataModel
データを管理するモデルを作ります。
```java
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;

import javax.inject.Inject;
import javax.inject.Singleton;

@Singleton
public class SampleDataModel {
    MutableLiveData<Boolean> testValue;

    @Inject
    public SampleDataModel(){
        testValue = new MutableLiveData<>(true);
    }

    public LiveData<Boolean> getTestValue(){
        return testValue;
    }

    public void updateTestValue(){
        if (testValue.getValue()) {
            testValue.postValue(false);
        } else {
            testValue.postValue(true);
        }
    }
}
```


# SampleDataViewModel
```java
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;

import javax.inject.Inject;

import dagger.hilt.android.lifecycle.HiltViewModel;

@HiltViewModel
public class SampleDataViewModel extends ViewModel {
    private SampleDataModel sampleDataModel;

    // SampleDataModelをInjectします
    @Inject
    public SampleDataViewModel(SampleDataModel sampleData){
        this.sampleDataModel = sampleData;
    }

    // SampleDataModelのtestValueをそのまま返却します
    public LiveData<Boolean> getTestValue(){
        return sampleDataModel.getTestValue();
    }

    public void updateTestValue(){
        sampleDataModel.updateTestValue();
    }
}
```

# MainActivity

```java
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import dagger.hilt.android.AndroidEntryPoint;

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 各Viewの取得
        textView = findViewById(R.id.text);
        button = findViewById(R.id.button);

        // ViewModelを呼び出します
        SampleDataViewModel sampleViewModel = new ViewModelProvider(this).get(SampleDataViewModel.class);

        // SampleDataのtestValueの状態をViewModel経由で監視します
        Observer<Boolean> observer = new Observer<Boolean>() {
            @Override
            public void onChanged(Boolean testValue) {
                if (testValue != null) {
                    // testValueが真であればA, 偽であればBをtextViewにセットする
                    if (testValue) {
                        textView.setText("A");
                    } else {
                        textView.setText("B");
                    }
                }
            }
        };
        sampleViewModel.getTestValue().observe(this, observer);

        // Buttonを押した際のイベントを定義します
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sampleViewModel.updateTestValue();
            }
        });
    }
}
```

以上です。
備忘録のためのメモという感じですが、参考になれば嬉しいです。