日々是好日

プログラミングについてのあれこれ、ムダ知識など

MVVM 完全に理解した - 6

MVVM 理解するために、小さいテストアプリを作ってみます。
お題は前回投稿した簡易メモアプリ。

プロジェクトを作る

MVVMPractice とでもしてプロジェクト生成。

Gradle の編集

Data Binding と Architecture Components を有効にするため、app.gradleに次を追加する。

android {
    dataBindign {
        enabled = true
    }
}

dependencies {
    def lifecycle_version = "1.1.1"
    def design_version = "28.0.0"

   //Floating Action Button用
   implementation "com.android.support:design:$design_version"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"

    // optional - ReactiveStreams support for LiveData
    implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"

    // optional - Test helpers for LiveData
    testImplementation "android.arch.core:core-testing:$lifecycle_version"

    //AndroidXならこっち
    //def lifecycle_version = "2.0.0"
    //implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    //implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version" // use -ktx for Kotlin
    //testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
}

レイアウトファイルを生成

今回は MemosActivity (Main), AddEditActivity の Activity 2枚、それぞれの主な表示領域を Fragment で構成します。

Activity はいたって普通の構成なので省略、DataBinding は Fragment について行います。

fragment_memos.xml (Main のレイアウト)

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="viewmodel" type="work.kcs_labo.mvvmpractice.memos.MemosViewModel"/>
    </data>

    <android.support.constraint.ConstraintLayout ...>
        <!--適当-->
        <ListView android:layout_width="wrap_content" android:layout_height="wrap_content"/>
    </android.support.constraint.ConstraintLayout>
</layout>

fragment_addedit_memo.xml

<layout xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable name="viewmodel" type="work.kcs_labo.mvvmpractice.addeditmemo.AddEditMemoViewModel"/>
    </data>
    <android.support.constraint.ConstraintLayout ...>

        <EditText
                android:text="@={viewmodel.title}"
                android:hint="@string/title" .../>
        <EditText
                android:text="@={viewmodel.memo}"
                android:hint="@string/memo" .../>
    </android.support.constraint.ConstraintLayout>
</layout>

Main画面にはメモ一覧を表示する予定ですが、ちょっとまだわからないので適当にListView置いてます。

BluePrints のサンプルアプリを読み解いてますが、しんどいので今日はここまで。
todo-mvvm-live-kotlinブランチにすると、Android アプリ設計パターン入門の解説とだいぶ違くて解読難航中。。。

分からないところ

  • ~Bindingクラスって、改めて何をするクラス?
  • ~Bindig#setContentView~Bindig#bindの動作、機能
  • テストとかをあまり考えない場合、どこまで実装を簡略化できるのか?