Databinding使用篇二

2021-01-02  本文已影响0人  Method

事件处理

方法引用


<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")
}

注意:

监听器绑定

绑定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和其他参数
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>
上一篇下一篇

猜你喜欢

热点阅读