美文网首页
Databinding使用篇二

Databinding使用篇二

作者: Method | 来源:发表于2021-01-02 17:29 被阅读0次

事件处理

方法引用


<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>

相关文章

  • android databinding 初体验

    这是一篇databinding使用初体验,文章主要介绍了databinding使用,如何使用DataBinding...

  • DataBinding

    dataBinding的使用 一、databinding的配置方法 二、databinding的基本使用 三、da...

  • JetPack学习笔记之DataBinding(二)

    JetPack学习笔记之DataBinding(二) 上一篇文章中介绍了DataBinding的基本使用方法,通过...

  • Databinding使用篇二

    事件处理 方法引用 注意: 方法创建、参数、方法调用(应该只有一个view参数,带参数的可用监听器绑定) 如果想传...

  • Databinding基本使用和原理

    一、Databinding基本使用 实体类 布局文件 基本使用 二、Databinding原理分析 Databin...

  • Databinding资料

    1. DataBinding的基本使用(一) 2. DataBinding的基本使用(二) 3. DataBind...

  • DataBinding补坑

    上个星期咧写了篇databinding的入门使用 [DataBinding绑定控件]http://www.jian...

  • ViewModel+LiveData+DataBinding使用

    ViewModel+LiveData+DataBinding使用 Android DataBinding 使用博客...

  • Databinding 使用二

    上一篇中我们介绍了 databinding 的简单使用, 简单绑定view, 以及加载显示静态的数据, 但是实际在...

  • DataBinding笔记1

    开启DataBinding 需要使用DataBinding 得xml文件 简单使用 textview 文本拼接使用...

网友评论

      本文标题:Databinding使用篇二

      本文链接:https://www.haomeiwen.com/subject/szweoktx.html