プロジェクト

全般

プロフィール

Androidプログラミング-ViewModel

概要

MVVMアーキテクチャのVM(View Model)を担うコンポーネント。Activity/Fragmentのライフサイクルを超えてデータを保持する。

ViewModelの作成

素の実装

アプリケーションコンテキストを使用するViewModel

注意点

Activityコンテキストを持たせない

ライフサイクルがActivityより長いため、ViewModelでActivityコンテキストの参照を保持すると途中で無効な参照となります。
コンテキスト情報へのアクセスを必要とするViewModelを実装するには、Applicationコンテキストを使用し、AndroidViewModelを継承して作成します。

ViewModelの利用

古い(非推奨=Deprecated)なAPIに注意

ViewModelの記事を探っていると、次のAPIでViewModelを取得する記述を見かけますが、これは既に古い(互換性のために残しており将来削除される)APIとなっています。

val model = ViewModelProviders.of(this).get(MyViewModel::class.java)

Activityの中で利用する

ViewModelProvider を使う

class MainActivity : AppCompatActivity() {

    private val model: MainViewModel by lazy {
        ViewModelProvider.NewInstanceFactory().create(MainViewModel::class.java)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        :
        textview_main_label.text = model.title
    }

Kotlin拡張ライブラリを使う

class MainActivity : AppCompatActivity() {

    private val model: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        :
        textview_main_label.text = model.title
    }
  • モジュールレベルのbuild.gradleに、依存関係を追加します。
    dependencies {
        :
        implementation 'androidx.activity:activity-ktx:1.1.0'
        :
    
  • Java 8 を使用する設定をします。
    [File]メニュー > [Project Structure] で、左側ペイン [Modules]を選択、右側ペイン [Properties]タブを選択、
    Target Compatibiliety欄を [1.8 (Java 8)]に設定
  • モジュールレベルのbuild.gradleに、次の設定を追加
    android {
        :
        kotlinOptions {
            jvmTarget = "1.8" 
        }
    }