概要
- ボタンを押すと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();
}
});
}
}
以上です。
備忘録のためのメモという感じですが、参考になれば嬉しいです。