Data Binding

根据变量,自动赋值到各widget。

How

1.编写layout文件,这里的layout为: act_data_bind_demo.xml

这里需要先准备变量

在具体的widget上使用该变量 <TextView android:layoutwidth="matchparent" android:layoutheight="wrapcontent" android:text="@{user.name}"/>

2.Binding data 上面的步骤完成后,需要先编译整个Project,因为在这个过程中会生成一些类:DataBindingUtil,ActDataBindDemoBinding

注意:这里的ActDataBindDemoBinding是根据上面的布局文件的名字生成的。

在onCreate方法中:

ActDataBindDemoBinding binding = DataBindingUtil.setContentView(this,
R.layout.act_data_bind_demo); customer = new Customer();
customer.setName("Andy");
customer.setMobile("13866668888"); binding.setUser(customer);

运行后,可以看到页面中的两个TextView都有值。

问题:如何获取EditText的输入内容?

failed:

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:text="@{user.email}"/>

It's work: "

...android:text="@={user.email}"

问题:如何通过一个按钮改变当前页面中的TextView的值?

1.module类继承BaseObservable

public class Customer extends BaseObservable {
...
public void setMobile(String mobile) {
this.mobile = mobile;
notifyPropertyChanged(BR.mobile);
}

继承BaseObservable,同时在setter方法中调用notifyPropertyChanged。

2.更新Java中的Customer对象,例如当mobile改变,UI会制动刷新。

Custom Binding Class Names

默认情况下,Binding Class是根据layout文件名生成的。(例如,当layout文件为act_data_bind_demo.xml,生成的class为:ActDataBindDemoBinding)

可以自定义类名,以及设定包名:

<data class="com.andy.infrastructure.demos.databinding.DataBind">
<variable ...
</data>

上面的代码中,会在包com.andy.infrastructure.demos.databinding下生成一个名为DataBind的类。注意这个package必须是存在的,当然也可以不指定package(会在默认的包下生成该类)。

Include

在layout文件中使用include时,也可以传递数据到指定的layout中。需要额外2个步骤:

  1. 确保传递的变量在两个layout中都有声明

    <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto"> ... ... <include layout="@layout/user_name" bind:user="@{user}"/>

    被引入的layout: ...

    <TextView android:layoutwidth="matchparent" android:layoutheight="wrapcontent" android:padding="15dp" android:text="@{user.name}">

  2. 外层layout中传递变量

    <include layout="@layout/user_name" bind:user="@{user}"/>

Expression Language

  • 数学运算 + - / * %
  • 字符串拼接 +
  • 逻辑运算符 && ||
  • 位运算 & | ^
  • Unary + - ! ~
  • 位移 >> >>> <<
  • 比较运算符 == > < >= <=
  • instanceof
  • Grouping ()
  • Literals character, String, numeric, null
  • Cast
  • Method calls
  • Field access
  • Array access []
  • 三元运算符 ? :

  • Null Coalescing Operator ??

如果??左边不为空就使用左边值,否则就使用右边的值。

 android:text="@{user.displayName ?? user.lastName}"

上面的代码相当于:

android:text="@{user.displayName != null ? user.displayName : user.lastName}"

Data Objects

三种数据更新提示机制:

  • Observable Object
  • Observable Fields
  • Observable Collections

Observable Object

这种方式,需要做三个步骤:

  • 继承BaseObservable
  • 为getter添加@Bindable
  • 在setter中添加代码notifyPropertyChanged(BR.name);

Views With IDs

A public final field will be generated for each View with an ID in the layout. The binding does a single pass on the View hierarchy, extracting the Views with IDs. This mechanism can be faster than calling findViewById for several Views.

layout文件中widget有设置id时,可以使用bind对象直接访问该控件,省去findViewById

 

文本中的代码示例,链接如下:

源码:https://github.com/ithaibo/InfrastructureAndroid/tree/master/app/src/main/java/com/andy/infrastructure/demos/databinding

Data Binding使用技巧的更多相关文章

  1. Data Binding和INotifyPropertyChanged是如何协调工作的?

    前言 WPF的一大基础就是Data Binding.在基于MVVM架构的基础上,只有通过实现INotifyPropertyChanged接口的ViewModel才能够用于Data Binding. 要 ...

  2. WPF QuickStart系列之数据绑定(Data Binding)

    这篇博客将展示WPF DataBinding的内容. 首先看一下WPF Data Binding的概览, Binding Source可以是任意的CLR对象,或者XML文件等,Binding Targ ...

  3. XAML数据绑定(Data Binding)

    XAML数据绑定(Data Binding)   Data Binding可以使得XAML标签属性的赋值更为灵活和方便.在绑定过程中,获取数据的标签成为目标标签:提供数据的标签成为源标签.在XAML中 ...

  4. Optimizing Performance: Data Binding(zz)

    Optimizing Performance: Data Binding .NET Framework 4.5 Other Versions   Windows Presentation Founda ...

  5. .NET: WPF Data Binding

    WPF是分离UI和Logic的最佳工具,不同于Window Form的事件驱动原理,WPF采用的是数据驱动,让UI成为了Logic的附属,达到分离的效果. 本篇主要讲讲wpf的精华:data bind ...

  6. WP8.1 Study5:Data binding数据绑定

    一.数据绑定 最简单的编程UI控件的方法是写自己的数据来获取和设置控件的属性,e.g. , textBox1.Text = "Hello, world"; 但在复杂的应用程序,这样 ...

  7. Data Binding in WPF

    http://msdn.microsoft.com/en-us/magazine/cc163299.aspx#S1   Data Binding in WPF John Papa Code downl ...

  8. Data Binding(数据绑定)用户指南

    1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件. Data Binding库不仅灵活而且广泛兼容- 它 ...

  9. 完全掌握Android Data Binding

    转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html 来源 https://github.com/L ...

随机推荐

  1. Android中使用Notification实现进度通知栏(Notification示例三)

    我们在使用APP的过程中,软件会偶尔提示我们进行版本更新,我们点击确认更新后,会在通知栏显示下载更新进度(已知长度的进度条)以及安装情况(不确定进度条),这就是我们今天要实现的功能.实现效果如下: 在 ...

  2. iOS 如何使用Safari浏览器打开app

    1.首先在info.plist添加一个键值对,如下图 或 2.在appdelegate.m文件如下方法写代码 -(BOOL)application:(UIApplication*)app openUR ...

  3. IOS 网络浅析-(十一 三方 AFNetworking3.0简介)

    AFNetworking3.0是目前最新的版本,本来打算介绍一下2.6,但是想想2.6名不久矣,就决定不介绍了,有兴趣的小伙伴可以上网查一查.下面我就开始进入正题了. 目前使用人数最多的第三方网络库, ...

  4. MyEclipse web项目导入Eclipse,详细说明

    最近导入一个MyEclipse的项目,具体是:spring4.1的web项目,同时遇到了一些问题,总结一下. 1.进入项目目录,找到.project文件,打开.增加一个<buildCommand ...

  5. 做一个java项目要经过那些正规的步骤

    理论上应该是: 一.立项 1.项目的功能的范围.实现技术方法和细节 2.需要多少人,需要的开发周期(根据客户的需求) 3.分析成本和风险 4.有相应的利润,可以立项 二.需求调研: 三.需求评审.确定 ...

  6. Spring 资源文件处理

    Java中,不同来源的资源抽象成URL,通过注册不同的handler(URLStreamHandler)来处理不同来源的资源的读取逻辑.一般handler的类型使用不同的前缀(协议,protocal) ...

  7. Jsoup系列学习(2)-解析html文件

    解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...

  8. sql语句查询经纬度范围(转载,源链接失效)

    MySQL性能调优 – 使用更为快速的算法进行距离 最近遇到了一个问题,通过不断的尝试最终将某句原本占据近1秒的查询优化到了0.01秒,效率提高了100倍. 问题是这样的,有一张存放用户居住地点经纬度 ...

  9. IT人士怎样的休息方式才高效

    为什么你睡了11个小时仍然觉得疲累? 为什么你花了好几万去岛国度假并没有增加生活的热情? 都说要去KTV,去夜店,去游乐园就能忘掉不快,更带劲地开始新的一天,但是尽兴归来心里只剩空虚? 我们真的明白休 ...

  10. 【原】pageResponse - 让H5适配移动设备全家(移动端适配)

    上一篇文章<为什么选择iPhone5的分辨率作为H5视觉稿尺寸>最后留下了问题:是否需要视觉设计师设计多套的视觉稿供给前端工程师做页面适配呢?按照自己以前的方法,通常会要求设计师设计2套的 ...