1.官方文档

  https://developer.android.com/topic/libraries/data-binding/expressions.html

2.绑定表达式的约束

2.1 允许的运算符

符号运算符 + -  
括号运算符 ()  
成员访问运算符 obj.成员 array[indx]
类型运算符 instanceof 类型强转运算符,如(int)data.pi
算数运算符 + - / * % 包括字符串的+ ,如  '@{"image_" + id}'
位运算符 & | ^ ! ~ >>  >>>  <<
关系运算符 == > < >= <= 其中的< 要用html转移字符&lt;
逻辑运算符

&& ||

 
三目运算符

?:

 
非空选择运算符

??

??左边非空就返回左边,否则返回右边,如 @{user.displayName ?? user.lastName}

2.2 不允许的运算符及关键字

  new、super、this、泛型调用

2.3 允许函数调用以及lamda表达式

如:
    android:text="@{String.valueOf(index + 1)}"
    android:onClick="@{() -> presenter.onSaveClick(task)}"

2.4 允许使用集合

声明:

 <data>
<import type="android.util.SparseArray"/>
<import type="java.util.Map"/>
<import type="java.util.List"/>
<variable name="list" type="List&lt;String>"/>
<variable name="sparse" type="SparseArray&lt;String>"/>
<variable name="map" type="Map&lt;String, String>"/>
<variable name="index" type="int"/>
<variable name="key" type="String"/>
</data>

使用:


android:text="@{list[index]}"

android:text="@{sparse[index]}"

android:text="@{map[key]}"

2.5 允许字符常量

两种方式:

单引号内使用双引号

    android:text='@{map["firstName"]}'

或者双引号内使用单引号

    android:text="@{map[`firstName`]}"

2.6 允许使用资源

    android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"

2.7 import类型

 <data>
<import type="com.example.User"/>
<import type="com.example.MyStringUtils"/>
<import type="java.util.List"/>
<import type="android.view.View"/>
<variable name="user" type="User"/>
<variable name="userList" type="List&lt;User>"/>
</data>

使用:

 <TextView
android:text="@{MyStringUtils.capitalize(user.lastName)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

2.8 类型别名

 <import type="android.view.View"/>
<import type="com.example.real.estate.View"
alias="Vista"/>

2.9 Include

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="data" type="com.example.databind.Data" />
<variable name="click" type="com.example.databind.Click" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{click::onStartClicked}"
android:clickable="true"> <include
android:id="@+id/include"
layout="@layout/include"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="@+id/frgmt2"
app:layout_constraintStart_toStartOf="@+id/frgmt2"
app:layout_constraintTop_toBottomOf="@+id/frgmt2"
bind:data="@{data}" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout>

其中

  • xmlns:bind="http://schemas.android.com/apk/res-auto" 声明 bind
  • layout指定的布局是一个完整的数据绑定布局文件。
  • 数据绑定不支持 <merge> include,如下:
     <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <data>
    <variable name="user" type="com.example.User"/>
    </data>
    <merge><!-- Doesn't work -->
    <include layout="@layout/name" bind:user="@{user}"/>
    </merge>
    </layout>

3.绑定事件

3.1 两种方法

方法 指定事件处理函数  绑定事件监听器

参数要求

参数与返回值必须与listener对应的事件函数一致,如View.OnClickListener(View v)

可任意参数,返回值要与对应事件处理函数一致。

listener创建时机

指定的方法不为空时,才创建。

绑定数据对象时就创建,始终存在。

3.2 指定处理函数示例

第一步:定义处理事件的方法,它的参数要与对应的listener一样

 public class Click {
public void onBackGroundClicked(View view){ }
}

第二步:在layout定义指定处理事件的方法

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="data" type="com.example.databind.Data" />
<variable name="click" type="com.example.databind.Click" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{click::onStartClicked}"
android:clickable="true">
... </androidx.constraintlayout.widget.ConstraintLayout> </layout>

第三步:关联方法

     private FrgmtMainBinding    binding;

     private void init(View view){
binding = DataBindingUtil.bind(view); MainActivity main = (MainActivity) getActivity(); binding.setData(main.data);
binding.setClick(new Click());
}

3.2 绑定事件监听器示例

监听器代码:

 public class Click {
public void onResetClicked(Data data){
data.key = "time";
data.value = ;
}
}

在layout中绑定:

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="data" type="com.example.databind.Data" />
<variable name="click" type="com.example.databind.Click" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{click::onStartClicked}"
android:clickable="true"> <Button
android:id="@+id/reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:text="reset"
android:onClick="@{() -> click.onResetClicked(data)}"
android:textAllCaps="false"
app:layout_constraintBottom_toBottomOf="@+id/start"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/stop"
app:layout_constraintTop_toTopOf="@+id/start"
app:layout_constraintVertical_bias="1.0" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout>

其中:

  第22行的是lamda表达式,也可以把指定参数。

    android:onClick="@{(view) -> click.onResetClicked(data)}"
												

android 数据绑定(2)绑定表达式的更多相关文章

  1. android 数据绑定(1)Ativity、Fragment、Item绑定数据源

    1.简介 官方文档:  https://developer.android.com/topic/libraries/data-binding 官方示例: https://github.com/andr ...

  2. Android数据绑定DataBinding(二)入门篇

    前言 之前写了Android数据绑定DataBinding(一)入门篇,很简单的记录了如何使用DataBinding,其初衷是想要代码中的数据发生改变,不需要繁琐的setText等操作,在最后说到了只 ...

  3. Android数据绑定技术一,企业级开发

    PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...

  4. Android应用程序绑定服务(bindService)的过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6745181 Android应用程序组件Serv ...

  5. Android应用程序绑定服务(bindService)的过程源码分析

    Android应用程序组件Service与Activity一样,既能够在新的进程中启动,也能够在应用程序进程内部启动:前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部 ...

  6. salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)

    在salesforce的classic中,我们使用{!expresion}在前台页面展示信息,在lightning中,上一篇我们也提及了,如果展示attribute的值,可以使用{!v.expresi ...

  7. 2018-12-22-WPF-在绑定表达式添加计算

    title author date CreateTime categories WPF 在绑定表达式添加计算 lindexi 2018-12-22 16:12:56 +0800 2018-12-22 ...

  8. Android中使用lambda表达式

    lambda 语法简介 视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 如果刚学Android,不知道怎么写点击事件可以跳转,传送门 要想在Android中使用lambda语法 ...

  9. android 数据绑定(6)自定义绑定方法、双向数据绑定

    1.官方文档 https://developer.android.com/topic/libraries/data-binding/binding-adapters https://developer ...

随机推荐

  1. 18-2-call和apply

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. lxml etree对存在的xml添加新节点,新节点没有排版格式化

    新添加的时候如果不做处理,是这个样子 要在解析xml加上 parser = etree.XMLParser(remove_blank_text=True)xml = etree.parse(major ...

  3. Oracle批量更改用户下表空间

    --查询某个用户下的表,并生成一个修改其命名空间的批处理语句 select 'alter table '|| table_name ||' move tablespace 要迁入的表空间;' from ...

  4. 74CMS漏洞打包(从老博客转)

    引子 这套CMS是上个月中做的审计,总共找到几个后台漏洞,可后台getshell,一个逻辑漏洞可任意发短信,还有一个前台注入漏洞.不过发到了某平台上之后,审核又要求我提交利用的poc,所以懒得发去了, ...

  5. Android开发 Html工具类详解

    前言 在一些需求富文本显示或者编辑的开发情况下,数据都是用html的格式来保存文本信息的.而google是有提供解析html的工具类那就是Html.有了Html可以让TextView也支持富文本(其实 ...

  6. 8年前诞生于淘宝,细数阿里云RPA 的前世今生!

    9月10日,踏入55岁的马云正式卸任阿里巴巴董事局主席一职,由阿里巴巴集团CEO张勇接任.公寓创业.西湖论剑.美国敲钟,从成立到登顶中国最值钱的公司,阿里巴巴只用了20年. 阿里云RPA,2011年诞 ...

  7. php链表笔记:链表的检测

    <?php /** * Created by PhpStorm. * User: huizhou * Date: 2018/12/2 * Time: 11:48 */ /** * 链表的检测 * ...

  8. lumen框架使用Elasticsearch详解

    该博文是集合几个博客踩坑得来的,百度热搜前几篇都是缺胳膊少腿的,所以结合几篇博客实现了一遍. 一.lumen使用Elasticsearch 首先需要搭建好的elasticsearch环境: http: ...

  9. php数据结构课程---6、常见排序有哪些

    php数据结构课程---6.常见排序有哪些 一.总结 一句话总结: 冒泡排序(Bubble sort):依次交换 选择排序 ( Selection Sort ):在未排序序列中找到最小(大)元素,依次 ...

  10. SpringBoot 03_利用FastJson返回Json数据

    自上一节:SpringBoot 02_返回json数据,可以返回json数据之后,由于有些人习惯于不同的Json框架,比如fastjson,这里介绍一下如何在SpringBoot中集成fastjson ...