Android 再入門 〜データバインディング①〜

今から5年くらい前に1本 Android アプリを作って以来 Android から離れてしまったので、再度入門する。

前提

  • 当時 Java 独学習得後、実務経験ほぼなしでアプリ作成した
  • なんとなく Android の仕組みは知っている
  • Kotlin 初心者
  • Activity に全部書いていた時代の人

とりあえず Hello World アプリを作った。

Empty Activity テンプレートをそのままビルドして起動しただけ。

Hello World

これをベースに DataBinding を適用していく。

https://developer.android.com/topic/libraries/data-binding/?hl=ja

設定の追加

app/build.gradle

android {
    compileSdkVersion 28

    // ▽ データバインディングを有効にする
    dataBinding {
        enabled = true
    }
    // △
    defaultConfig {
        applicationId "app.hondash.helloworld"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

レイアウトファイルを編集

res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

を修正する。やったことは以下の通り。

  • layout タグを追加
  • ConstraintLayout タグから xmlns 属性を削除し、layout タグに付与
  • TextView の android:text を修正
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable name="user" type="app.hondash.helloworld.User"/>
    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</layout>

data タグに DataBinding の設定を書いていくっぽい。

variable の type が該当する FQN になっていて、name が layout に組み込む際に使用する変数名となる。

データクラスの作成

該当するデータクラスが必要なので作成する。

User.kt

data class User(
        val firstName: String,
        val lastName: String
)

Activity でバインディングする

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 型名は layout ファイル名に依存していて、 パスカルケースに変更して + Binding を付けた型名になる
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        val user = User("Taro", "Yamada")
        binding.setUser(user)
    }
}

完成

Hello DataBinding

拡張する

表示するだけならデータバインディングの意味があまりないので、ボタンを押したら名前が変わる、という実装をやろうとした。

が、 user.firstName = "hoge" だけでは変更してくれなかったので次回まとめる。

次回