ViewとCodeを関連付ける方法として
findViewById してたのを ButterKnife 使うようになって特に困ってなかったんですが
先日のDroidKaigi2016でDataBindingのお話を聞いて試そうと。
言語もKotlinがこれから良さそうだぞ。と
ButterKnife時代はViewHolderを自前で用意してましたが
BindingクラスがViewHolderの役割をやってくれるらしく
(但しRecyclerViewはRecyclerView.ViewHolder型のItemなのですが)
勉強がてらKotlinでDataBindingする記事を書きます。随時追記します。
環境
- Android Studio 2.1 Preview 4
- Kotlin Plugin 1.0.1
- SDK Updateで諸々最新に
まずはJavaでData Binding
いきなりKotlinではなく
新規プロジェクト(Empty Activity)を作って、まずJavaでお試し
Gradle設定
DataBindingを有効に
android {
// 省略
dataBinding {
enabled true
}
}
Layout
- 元々のレイアウト全体をlayoutで囲って
- データクラスをdataに記述
- TextViewのtext属性にデータクラスのメンバを割当
この記述はKotlinになっても同じです。
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<data>
<variable
name="user"
type="ssuzaki.databindingsample.User"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="ssuzaki.databindingsample.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user._name}"/>
</RelativeLayout>
</layout>
データクラス
名前を保持するだけの簡単なものを用意。
ここで一旦リビルド
public class User {
private final String _name;
public User(String name) {
_name = name;
}
public String get_name() {
return _name;
}
}
Activity
setContentViewのかわりにDataBindingUtil.setContentViewして
戻り値としてActivity名+Bindingの名前でクラスが用意されるので
ActivityMainBindingクラス経由でテキストをUIへ反映すると
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("ssuzaki");
binding.setUser(user);
}
}
結果
反映されました
これをKotlinで
Javaで作ったこれを今度はKotlinに。
(Kotlinプラグインの追加とかプロジェクトへの反映は省略)
Kotlin用Gradle設定
KotlinでData Bindingを使う時の設定 を参考に、BindingクラスをKotlinからも見えるようにおまじない
dependencies {
// 省略
kapt 'com.android.databinding:compiler:1.0-rc5'
}
kapt {
generateStubs = true
}
Layout
Kotlinになるから何を変えるわけでもなく
Java時代に作ったLayoutをそのまんま使います。
Activity
Kotlin Pluginの機能でMainActivity.javaをMainActivity.ktへコンバート
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val user = User("ssuzaki")
binding.user = user
}
}
データクラス
同様にデータクラスもKotlinへコンバート
class User(val _name: String)
結果
同じです