Kotlin×DataBindingで「アイエエエ onClick() 呼ばれないナンデ?!?!」となったときに確認すること

  • 2
    いいね
  • 2
    コメント

凡ミスをやってしまったので備忘メモ。👾

DataBindingでonClick()実装

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="owner"
            type="com.shanonim.sample.MainActivity" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <Button
            android:id="@+id/button"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:onClick="@{() -> owner.onClickButton()}"
            android:text="@android:string/ok" />
    </RelativeLayout>
</layout>

クラス側でonClickButton()を書いてあげると、タップ時にメソッドが実行されます。

fun onClickButton() {
    Toast.makeText(this, "tapped", Toast.LENGTH_SHORT).show()
}

onClick()が呼ばれない...😢

下記の実装では、ボタンをタップしてもonClickButton()が呼ばれません。

MainActivity.kt
class MainActivity : Activity() {

    var binding: ActivityMainBinding? = null

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

    ...

【解決策】binding!!.○○ = thisを忘れない🙅

xml側の<variable>で指定しているnameとViewを紐付けてあげないといけません。

<?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="owner"
            type="com.shanonim.sample.MainActivity" />
    </data>

であれば、

binding!!.owner = this

が必要です。

先ほどのActivityのコードを補足してみます。

class MainActivity : Activity() {

    var binding: ActivityMainBinding? = null

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

    ...

これで無事にボタンがタップできるようになりました🎉