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" } }