Android Jetpack ViewModelによる画面回転時のデータ保持

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がデータを保持するため、カウンターの値が失われることはありません。

タグ: Android Jetpack ViewModel データ永続化 画面回転

5月18日 23:15 投稿