0
Help us understand the problem. What are the problem?

posted at

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

概要

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

スクリーンショット 2022-05-27 14.25.41.png

構成

  • 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();
            }
        });
    }
}

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?