LoginSignup
6
7

More than 5 years have passed since last update.

Android:Data Bindingメモ(Java to Kotlin)

Last updated at Posted at 2016-04-01

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になっても同じです。

activity_main.xml
<?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>

データクラス

名前を保持するだけの簡単なものを用意。
ここで一旦リビルド

User.java
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へ反映すると

MainActivity.java
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);
    }
}

結果

反映されました

shot.png

これを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へコンバート

MainActiity.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へコンバート

User.kt
class User(val _name: String)

結果

同じです

shot.png

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7