android 数据绑定(2)绑定表达式
1.官方文档
https://developer.android.com/topic/libraries/data-binding/expressions.html
2.绑定表达式的约束
2.1 允许的运算符
符号运算符 | + - | |
括号运算符 | () | |
成员访问运算符 | obj.成员 | array[indx] |
类型运算符 | instanceof | 类型强转运算符,如(int)data.pi |
算数运算符 | + - / * % | 包括字符串的+ ,如 '@{"image_" + id}' |
位运算符 | & | ^ ! ~ | >> >>> << |
关系运算符 | == > < >= <= | 其中的< 要用html转移字符< |
逻辑运算符 |
|
|
三目运算符 |
|
|
非空选择运算符 |
|
??左边非空就返回左边,否则返回右边,如 |
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<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<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<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)绑定表达式的更多相关文章
- android 数据绑定(1)Ativity、Fragment、Item绑定数据源
1.简介 官方文档: https://developer.android.com/topic/libraries/data-binding 官方示例: https://github.com/andr ...
- Android数据绑定DataBinding(二)入门篇
前言 之前写了Android数据绑定DataBinding(一)入门篇,很简单的记录了如何使用DataBinding,其初衷是想要代码中的数据发生改变,不需要繁琐的setText等操作,在最后说到了只 ...
- Android数据绑定技术一,企业级开发
PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...
- Android应用程序绑定服务(bindService)的过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6745181 Android应用程序组件Serv ...
- Android应用程序绑定服务(bindService)的过程源码分析
Android应用程序组件Service与Activity一样,既能够在新的进程中启动,也能够在应用程序进程内部启动:前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部 ...
- salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)
在salesforce的classic中,我们使用{!expresion}在前台页面展示信息,在lightning中,上一篇我们也提及了,如果展示attribute的值,可以使用{!v.expresi ...
- 2018-12-22-WPF-在绑定表达式添加计算
title author date CreateTime categories WPF 在绑定表达式添加计算 lindexi 2018-12-22 16:12:56 +0800 2018-12-22 ...
- Android中使用lambda表达式
lambda 语法简介 视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 如果刚学Android,不知道怎么写点击事件可以跳转,传送门 要想在Android中使用lambda语法 ...
- android 数据绑定(6)自定义绑定方法、双向数据绑定
1.官方文档 https://developer.android.com/topic/libraries/data-binding/binding-adapters https://developer ...
随机推荐
- nodejs的安装和环境配置
在安装npm的时候可能会报错, 可以按准过cnpm时淘宝在国内的npm镜像 命令如下:npm install -g cnpm --registry=https://registry.npm.taoba ...
- android 遍历控件
做个笔记 androuid 遍历一个 view 下面的子view // 保存 btnSaveRout.setOnClickListener(new OnClickListener() { @Overr ...
- System.UriFormatException: Invalid URI 解决方法
mobox 企业网页登陆界面,sa 登陆后 提示 System.UriFormatException: Invalid URI: The URI scheme is not valid. at Sys ...
- 辨析JspWriter和PrintWriter
JspWriter和PrintWriter的区别? JspWriter相当于带缓冲的PrintWriter 如何控制out缓冲? 通过设置JSP页面page指令的buffer属性, 可以调整out缓冲 ...
- js微信禁止分享
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js ...
- MyEclipse使用总结——将原有的MyEclipse中的项目转成maven项目[转]
前面一篇文章中我们了解了 在myeclipse中新建Maven框架的web项目 那么如果我们原来有一些项目现在想转成maven项目应该怎么做呢 我收集到了三种思路: 一.新建一个maven项目,把原项 ...
- 深入浅出 Java Concurrency (27): 并发容器 part 12 线程安全的List/Set[转]
本小节是<并发容器>的最后一部分,这一个小节描述的是针对List/Set接口的一个线程版本. 在<并发队列与Queue简介>中介绍了并发容器的一个概括,主要描述的是Queue的 ...
- System.Web.Mvc.FilePathResult.cs
ylbtech-System.Web.Mvc.FilePathResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, Pub ...
- OpenCASCADE圆与平面求交
OpenCASCADE圆与平面求交 eryar@163.com 在 解析几何求交之圆与二次曲面中分析了OpenCASCADE提供的类IntAna_IntConicQuad可以用来计算圆与二次曲面之间的 ...
- 报错C1189 #error: "No Target Architecture"
根本原因: 是因为单独包含了一些windows.h已经包含了的头文件如"fileapi.h","WinUser.h",但是却没有包含windows.h 或者先包 ...