[Android/Kotlin] DataBinding (基礎)



## [DataBindingとは？]

```diff_kotlin
 val button:Button = findViewById(R.id.btn1) 
 //基本的なViewの生成のやり方
```
普通アプリの画面を作る時、Viewを生成しそのViewに値を入れたり、画像などをセットする
これでも不便ではないし問題ないですが10~個以上のviewがあると思ったら
すごく大変なことになる。

だからDataBindingを使う方がいいと思います。
DataBindingではfindViewById()を使わなくても良いし
自動でxmlで作ったViewを作ってくれる。
あとObservableを用いてリアルタイムでデータの変更も可能になるメリットがあります。


##　基本 Setting

DataBindingを使うためにまずセッティングが必要！　
build.gradle(Module:app)で

```diff_gradle
     android {
     ...
        dataBinding {
            enabled = true
        }
     ...
     }

     apply plugin: 'kotlin-kapt'
     ...
      dependencies {
        classpath 'com.android.databinding:compiler:4.x.x' //ここで4.x.xは自分のgradleバージョンに合わせて書く
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //Kotlinはこの行の追加も必要
	
}
```

## DataBindingの使い方

　DataBindingはxmlから直接作業をする。
　
activity_main.xml

```diff_xml
<?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>
    ...
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/btnSample"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="button"
         />

    </LinearLayout>
</layout>

```

   既存のタグ最上位に<layout>タグて包んで<data>タグの中には 
   xmlで使う変数を <variable>タグで作成する。


MainActivity.kt

```diff_kotlin

private lateinit var binding: ActivityMainBinding

	override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
        
    }

```

 MainActivityでも既存のsetContentViewではなく
 xmlの名前Bindingと言うクラスが自動で作られます。
 'activity_main.xml'だから ActivityMainBindingと言うクラスが作られる。
 xmlの変数を参照するには binding.ビューのName　で呼ぶことができます。


## ボタンのクリックイベントを実装して見よう

MainActivity.kt


```diff_kotlin

 fun btnClick(view : View){
        Toast.makeText(this,"Button Click",Toast.LENGTH_SHORT).show()
        //Todo 自分が実装したい処理を書く
    }

```

既存の場合は下記のように直接リスナーをつけてましたがDataBindingでは
簡単にメソッドを作って使用します。

```diff_kotlin

    btnSample.setOnClickListener { 
            //Todo
        }
```

activity_main.xml

```diff_xml
<?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="activity"
            type="com.example.databinding.MainActivity" />
   </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/btnSample"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="button"
            android:onClick="@{activity::btnClick} 
         />

    </LinearLayout>
</layout>

```

<data> タグの中に <variable> activityという変数を作成しました。 typeは経路を示しています。
<Button>の中にonClickを追加しました。
ここで注意点としては 必ず "@{変数名::メソッド名}" 書かないといけません。


```diff_kotlin

private lateinit var binding: ActivityMainBinding

	override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
        binding.activity = this@MainActivity
    }

```

最後にMainActivityで binding.activity(xmlで宣言したvariableのname)　にMainActivityを繋げる。
MVVMパタンでは ViewModelを用いてクリックのイベントを処理するようになります




##最後に

簡単にDataBindingがどういうものなのか実装して見ました。
応用してもっと快適なアプリを作ってみましょう。
今後 MVVMでの活用方法など記載してみます。
ご覧いただきありがとうございました。