0Pricing
Android Academy · レッスン

ViewModelとLiveData

ViewModelを使って構成変更に対応します。LiveDataでリアクティブなデータストリームを公開し、ActivityやFragmentで監視する方法を学びます。

「ViewModelとLiveData」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン1/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全6レッスンが含まれています。

Activityの問題点

Activityに直接データを保存すると、主に2つの問題が発生します。

  • ユーザーがスマートフォンを回転すると、Activityは破棄されて再作成されるため、データがすべて失われます
  • onCreateでネットワークからデータを取得すると、回転するたびに再取得され、無駄が生じます

ViewModelはこの2つの問題を解決します。

ViewModelとは

ViewModelは、次の役割を持つAndroid Architecture Componentです。

  • 構成変更(回転やテーマ変更)をまたいで存続する
  • UIに関連するデータとビジネスロジックを保持する
  • ユーザーが画面を完全に離れたときにのみ破棄される

基本的な指針として、回転後も保持したいデータはViewModelに入れます。

ViewModelの作成

ViewModelを継承し、Gradleの依存関係に追加します。

// app/build.gradle:
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'

import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {

    var count = 0
        private set

    fun increment() {
        count++
    }

    fun reset() {
        count = 0
    }
}

ActivityでのViewModelの取得

ViewModelProvider(またはby viewModels()デリゲート)を使って、ViewModelインスタンスを取得します。

import androidx.activity.viewModels

class CounterActivity : AppCompatActivity() {

    private lateinit var binding: ActivityCounterBinding
    // Android manages the ViewModel lifecycle — never instantiate it yourself
    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityCounterBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // This shows the count is preserved after rotation!
        binding.tvCount.text = viewModel.count.toString()

        binding.btnPlus.setOnClickListener {
            viewModel.increment()
            binding.tvCount.text = viewModel.count.toString()
        }
    }
}

LiveDataとは

LiveDataは、監視可能なデータホルダーです。UIがLiveDataの値を監視し、値が変わるとUIが自動的に更新されます。

  • ライフサイクルを認識する — アクティブなオブザーバーにのみ更新を通知します(Activityがバックグラウンドにある場合もクラッシュしません)
  • 常に最新 — 新しいオブザーバーは、最新の値をすぐに受け取ります

ViewModelでのLiveData

MutableLiveDataは非公開で使用し(ViewModelから書き込み可能)、LiveDataとして公開します(UIは監視のみ可能です)。

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {

    private val _count = MutableLiveData(0)
    val count: LiveData<Int> = _count  // read-only for the UI

    fun increment() {
        _count.value = (_count.value ?: 0) + 1
    }

    fun reset() {
        _count.value = 0
    }
}

ActivityでのLiveDataの監視

.observe(lifecycleOwner) { value -> }を呼び出して、変更に反応します。

class CounterActivity : AppCompatActivity() {

    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...

        // Automatically updates TextView whenever count changes
        viewModel.count.observe(this) { count ->
            binding.tvCount.text = count.toString()
        }

        binding.btnPlus.setOnClickListener { viewModel.increment() }
        binding.btnReset.setOnClickListener { viewModel.reset() }
    }
}

LiveDataとState Flowの比較

LiveDataは従来からある方法です。現在のKotlinコードでは、代わりにKotlin CoroutinesのStateFlowを使うことがよくあります。

  • StateFlow — コルーチンベースで、Androidへの依存がありません
  • Activity内でrepeatOnLifecycleを使って収集します
  • 複雑な状態管理に適しています

どちらもよく機能します。LiveDataは使い始めるのが簡単で、より大規模なアプリではStateFlowを使うことが多くなります。

複数のオブザーバーを持つViewModel

複数のUIコンポーネントで同じLiveDataを監視できます。たとえば、TextViewとButtonの有効状態の両方が、ViewModel内の同じデータ値に反応できます。ViewModelに追加のコードは必要ありません。

これにより関心が明確に分離されます。ViewModelは状態を保持し、UIは監視して描画するだけです。

理解度チェック

ViewModelはいつ破棄されますか?

まとめ:ViewModelとLiveData

これで、ライフサイクルを考慮したUIを構築できるようになりました。

  • ViewModelは構成変更(回転)をまたいで存続する
  • by viewModels()を使ってActivityでViewModelを取得する
  • MutableLiveData(非公開)とLiveData(公開)のパターンを使う
  • .observe(this) { value -> updateUI(value) }で監視する
  • UIは自動的に更新されるため、手動で更新する必要がない

次は、Roomデータベースを使ってデータを永続的に保存します。

よくある質問

「ViewModelとLiveData」レッスンは無料ですか?

はい。「ViewModelとLiveData」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全6レッスンが含まれています。

「ViewModelとLiveData」で何を学びますか?

ViewModelを使って構成変更に対応します。LiveDataでリアクティブなデータストリームを公開し、ActivityやFragmentで監視する方法を学びます。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/6です。

「ViewModelとLiveData」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ViewModelとLiveData
  2. Room Database
  3. コルーチンとSuspend関数
  4. Repositoryパターン
  5. Navigation Component
  6. Hiltによる依存性注入
← Android Academyに戻る