概要
- ボタンを押すとAとBが切り替わるだけのアプリです.
- MVVM+hilt+LiveDataを使っています。
- Model側の値更新を元にViewを更新します。
- javaです。
構成
- MainActivity : 画面描画とボタン押下時のイベント定義等
- SampleDataModel : testValueを管理するだけのクラス
- SampleDataViewModel : シンプルなviewModel
 ※SampleDataModelのtestValueが真ならばA, 偽ならばBを画面に表示することを想定しています
activity_main.xml
layout 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
データを管理するモデルを作ります。
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
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
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();
            }
        });
    }
}
以上です。
備忘録のためのメモという感じですが、参考になれば嬉しいです。
