事件处理
方法引用
<TextView
android:id="@+id/tv3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@{String.valueOf(user.age)}"
android:onClick="@{user::print}"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv2" />
fun print(view:View){
println("user--->$name $age")
}
注意:
- 方法创建、参数、方法调用(应该只有一个view参数,带参数的可用监听器绑定)
- 如果想传递参数 可以在binding为变量赋值时,在构造方法中传递值;在方法中调用
- text中只能放string类型,放别的类型报错
监听器绑定
绑定onClick() 参数view可以省略
<Button
android:id="@+id/tv4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.name)}"
android:onClick="@{()->presenter.login(user.name,user.name)}"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv3" />
fun login(phone:String,pwd:String){
println("账号密码是 ==== $phone $pwd")
}
注意:回调方法有返回值,如果不加返回值会报错
例如 onLongClick
fun longClick(view:View):Boolean{
println("longClick 被点击了")
return true
}
绑定onClick()并传递View
<CheckBox
android:id="@+id/cb_aggree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="同意隐私协议"
android:onClick='@{(theView)->presenter.agree(theView,"同意隐私协议")}'
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv4"
/>
注意:
- 这里底层原理就是在生成的绑定类中,通过view.setOnclickListener回调方法onClick()去调用presenter.agree方法
- xml中调用presenter.agree,参数个数要与java中参数类型个数相同
//如果想获取view和其他参数
fun agree(view:View, content:String){
if(view is CheckBox){
println("checked == ${view.isChecked} $content")
}
}
其他监听器绑定
android:onCheckedChanged="@{(cb, isChecked) -> presenter.agree(cb, isChecked)}"
替换
view.setOnCheckedChangeListener { cb, isChecked ->
}
注意
如果由于 null 对象而无法对表达式求值,则数据绑定将返回该类型的默认值。例如,引用类型返回 null,int 返回 0,boolean 返回 false,等等。
android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"
导入、变量、包含
导入
导入类
<import type="java.util.List" />
<import type="android.view.View" />
类别名
<import type="android.view.View" alias="AView"/>
类型转换
android:text="@{((User)(user.connection)).lastName}"
静态类
<import type="com.example.MyStringUtils"/>
android:text="@{MyStringUtils.capitalize(user.lastName)}"
变量
<import type="android.graphics.drawable.Drawable"/>
<variable name="user" type="com.example.User"/>
<variable name="image" type="Drawable"/>
<variable name="note" type="String"/>
包含
include
<include layout="@layout/view_text"
bind:user="@{user}"/>
view_text
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.hellojetpack.databinding.UserBean" />
</data>
ViewStub
<data>
<variable
name="bodyTempValue"
type="Float" />
<variable
name="envTempValue"
type="Float" />
</data>
<ViewStub
android:layout="@layout/item_body_env_temp_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
temp:bodyTempValue="@{bodyTempValue}"
temp:envTempValue="@{envTempValue}"
android:id="@+id/bodyEnvTempView" />
子布局
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="bodyTempValue"
type="Float" />
<variable
name="envTempValue"
type="Float" />
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="MissingDefaultResource">
<com.example.hellojetpack.databinding.viewstub.MTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:text="@{`身体:`+String.valueOf(bodyTempValue)+`环境:`+String.valueOf(envTempValue)}" />
</FrameLayout>
</layout>
if (!binding.notTempView.isInflated) {
//显示ViewStub
binding.notTempView.viewStub?.inflate()
}
merge
数据绑定不支持 include 作为 merge 元素的直接子元素。例如,以下布局不受支持:
<merge><!-- Doesn't work -->
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</merge>
网友评论