凡ミスをやってしまったので備忘メモ。👾
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
}
...
これで無事にボタンがタップできるようになりました🎉