ViewModelによる状態管理の実装
Android JetpackのViewModelコンポーネントは、画面の回転や設定変更時にデータを保持する仕組みを提供します。この実装ではカウンターアプリケーションを例に、ViewModelを使用して状態を管理する方法を示します。
ViewModelクラスの定義
まず、ViewModelを継承したカウンター管理クラスを作成します。このクラスはアプリのライフサイクルを超えてデータを保持します。
package com.example.counterapp;
import androidx.lifecycle.ViewModel;
public class CounterViewModel extends ViewModel {
private int currentCount = 0;
public int getCount() {
return currentCount;
}
public void setCount(int count) {
this.currentCount = count;
}
public void incrementCount() {
currentCount++;
}
public void addToCount(int value) {
currentCount += value;
}
}
アクティビティでのViewModelの活用
メインアクティビティではViewModelを初期化し、UIコンポーネントと連携させます。
package com.example.counterapp;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
public class MainActivity extends AppCompatActivity {
private CounterViewModel counterModel;
private TextView countDisplay;
private Button incrementButton;
private Button addTwoButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ViewModelの初期化
counterModel = new ViewModelProvider(this).get(CounterViewModel.class);
// UIコンポーネントの設定
initializeUIComponents();
updateDisplay();
}
private void initializeUIComponents() {
countDisplay = findViewById(R.id.countTextView);
incrementButton = findViewById(R.id.incrementButton);
addTwoButton = findViewById(R.id.addTwoButton);
incrementButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
counterModel.incrementCount();
updateDisplay();
}
});
addTwoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
counterModel.addToCount(2);
updateDisplay();
}
});
}
private void updateDisplay() {
countDisplay.setText(String.valueOf(counterModel.getCount()));
}
}
この実装では、静的な変数を使用せずにViewModelを通じて状態を管理しています。画面の向きが変更されてもViewModelがデータを保持するため、カウンターの値が失われることはありません。