0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Android/Kotlin] DataBinding (基礎)

Posted at

[DataBindingとは?]

 val button:Button = findViewById(R.id.btn1) 
 //基本的なViewの生成のやり方

普通アプリの画面を作る時、Viewを生成しそのViewに値を入れたり、画像などをセットする
これでも不便ではないし問題ないですが10~個以上のviewがあると思ったら
すごく大変なことになる。

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

 基本 Setting

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

     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

<?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>

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

MainActivity.kt


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


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

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


    btnSample.setOnClickListener { 
            //Todo
        }

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

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


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での活用方法など記載してみます。
ご覧いただきありがとうございました。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?