Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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
    }

    ...

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

iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away