今から5年くらい前に1本 Android アプリを作って以来 Android から離れてしまったので、再度入門する。
前提
- 当時 Java 独学習得後、実務経験ほぼなしでアプリ作成した
- なんとなく Android の仕組みは知っている
- Kotlin 初心者
- Activity に全部書いていた時代の人
とりあえず Hello World アプリを作った。
Empty Activity テンプレートをそのままビルドして起動しただけ。
これをベースに 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)
}
}
完成
拡張する
表示するだけならデータバインディングの意味があまりないので、ボタンを押したら名前が変わる、という実装をやろうとした。
が、 user.firstName = "hoge"
だけでは変更してくれなかったので次回まとめる。