Google在15年的发布大会上提出了DataBinding数据绑定框架,解决了Android编程的一大痛点。官方原生支持MVVM模型让我们可以在不改变既有的框架上使用上新的特性。它可以使我们的代码更加简洁,不必在页面中写太多的findViewById,省时省力。今天我们也体验了一把,记录下遇到的问题和简单的入门介绍下。

1、Android Studio需要更新到 1.3 版本,而且需要开启DataBinding功能:

在build.gradle配置:

android{
dataBinding{
enabled = true
}
}

2、布局

布局中,根节点要以layout开头,声明数据使用data标签。在data中可以为数据对象声明变量,引入要使用的类等。

(1)在具体控件中使用对象的数据也挺简单的,使用@{对象变量.对象属性}就可以取出数据了;

(2)支持绑定事件:@{对象.方法名(参数)}。

代码如下:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- DataBinding 现在根节点layout -->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 绑定的数据对象 -->
<data>
<!-- 为数据对象声明变量:user,取出属性的用法:@{user.userName} -->
<variable
name="user"
type="com.ha.cjy.databingdemo.model.UserModel"/>
<variable
name="presenter"
type="com.ha.cjy.databingdemo.MainActivityPresenter"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="12dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
android:textSize="16sp"
android:background="@android:color/white"
android:textColor="@color/colorPrimary"
android:hint="显示用户名"
android:text="@{user.userName}"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:padding="12dp"
android:textSize="16sp"
android:background="@android:color/white"
android:textColor="@color/colorPrimary"
android:hint="显示手机号码"
android:text="@{user.telPhone}"
/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="12dp"
android:background="@color/colorPrimary"/>
<EditText
android:id="@+id/et_userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:padding="12dp"
android:textSize="16sp"
android:background="@android:color/white"
android:textColor="@color/colorPrimary"
android:hint="输入用户名"
/>
<EditText
android:id="@+id/et_telPhone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:padding="12dp"
android:textSize="16sp"
android:background="@android:color/white"
android:textColor="@color/colorPrimary"
android:hint="输入手机号码"
/>
<Button
android:id="@+id/btn_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:padding="12dp"
android:textSize="16sp"
android:background="@color/colorPrimary"
android:textColor="#FFFFFF"
android:text="更新数据"
android:onClick="@{presenter.onClickEvent}"
/>
</LinearLayout>
</layout>

3、代码

在ManiActivity中,需要为布局和数据进行绑定操作:DataBindingUtil.setContentView(Activity activity, int layoutId)

package com.ha.cjy.databingdemo;

import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; import com.ha.cjy.databingdemo.databinding.ActivityMainBinding;
import com.ha.cjy.databingdemo.model.UserModel; public class MainActivity extends AppCompatActivity implements MainActivityPresenter{
//对应的是layout文件名,后缀Binding,这个是自动生成的
private ActivityMainBinding binding; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.setPresenter(this);
UserModel userModel = new UserModel("测试姓名","18012365485");
binding.setUser(userModel);
} @Override
public void onClickEvent(View view) {
//注意:使用DataBinding,控件的获取应该使用DataBinding对象,而不是通过findViewById获取(这样的方式获取不到控件的文本内容)
userModel.setUserName(binding.etUserName.getText().toString());
userModel.setTelPhone(binding.etTelPhone.getText().toString()); binding.setUser(userModel);
}
}

这样子做,就完成了一个简单的dataBinding的使用,代码也比以前简洁了许多。

但是,看到这里,同学们不禁要问了:“不是说dataBinding的核心功能是实现单向数据绑定呀,没有看到呀,还是以前取出输入的文本重新赋值的做法,只是实现形式不一样而已。”

没错,这样的做法确实没有体现出单向绑定数据功能。接下来,我们来改造一下代码。

package com.ha.cjy.databingdemo;

import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View; import com.ha.cjy.databingdemo.databinding.ActivityMainBinding;
import com.ha.cjy.databingdemo.model.UserModel; public class MainActivity extends AppCompatActivity implements MainActivityPresenter{
//对应的是layout文件名,后缀Binding,这个是自动生成的
private ActivityMainBinding binding; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //进行DataBinding绑定
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.setPresenter(this);
UserModel userModel = new UserModel("测试姓名","18012365485");
binding.setUser(userModel);
} @Override
public void onClickEvent(View view) {
//注意:使用DataBinding,控件的获取应该使用DataBinding对象,而不是通过findViewById获取(这样的方式获取不到控件的文本内容)
binding.getUser().setUserName(binding.etUserName.getText().toString());
binding.getUser().setTelPhone(binding.etTelPhone.getText().toString());
}
}

看下这句代码:binding.getUser().setUserName(binding.etUserName.getText().toString());我们使用dataBinding获取声明过的User对象,然后为其属性userName赋值。看到这里,我们也只是看到更改了数据,没有看到任何更新UI的代码。不要急,我们接着看一下数据类UserModel的实现就明白了。

package com.ha.cjy.databingdemo.model;

import android.databinding.BaseObservable;
import android.databinding.Bindable; import com.ha.cjy.databingdemo.BR; /**
* 用户
* Created by cjy on 17/12/5.
*/ public class UserModel extends BaseObservable {
/**
* 用户名
*/
//注解 数据变动更新UI更新
@Bindable
private String userName;
/**
* 手机号码
*/
@Bindable
private String telPhone; public UserModel() {
} public UserModel(String userName, String telPhone) {
this.userName = userName;
this.telPhone = telPhone;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
//与@Bindable配合使用,数据有更新,通知UI跟着更新
notifyPropertyChanged(BR.userName);
} public String getTelPhone() {
return telPhone;
} public void setTelPhone(String telPhone) {
this.telPhone = telPhone;
notifyPropertyChanged(BR.telPhone);
}
}

由上面代码中,我们看到了注解Bindable,这个是用来标识属性是否有变动。官方介绍如下:

The Bindable annotation should be applied to any getter accessor method of an
* {@link Observable} class. Bindable will generate a field in the BR class to identify
* the field that has changed.

当然了,只是标识属性变动是不够的,这时还是没有通知UI更新的。我们需要使用notifyPropertyChanged方法,告知UI数据变化了从而更新UI。注意,notifyPropertyChanged方法的参数需要使用BR.属性名才可以。dataBinding在BR类中为对象属性生成了唯一的标识码。

总结

看到这里基础的入门介绍就讲完了,其实还有很多更高级的用法,比如在RecyclerView中怎么用等等,大家可以去自己查阅资料学习,这样认识的可以更深刻。希望这篇文章对大家能够有所帮助。

Android-DataBinding入门1的更多相关文章

  1. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  2. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  3. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  4. Hello, Android 快速入门

    Hello, Android Android 开发与 Xamarin 简介 在这两节指南中,我们将 (使用 Xamarin Studio或 Visual Studio)建立我们的第一个 Xamarin ...

  5. Android工程师入门(二)——不忙不累怎么睡。。

    安卓开发迫在眉睫,这周入个门吧! Android工程师入门(二) 四.在界面中显示图片 ImageView 是显示图片的一个控件. --属性 src——内容图片: background——背景图片/背 ...

  6. [电子书] 《Android编程入门很简单》

    <Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...

  7. Android实现入门界面布局

    Android实现入门界面布局 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 首先是常量的定义,安卓中固定字符串应该定义在常量中. stri ...

  8. Android从入门到精通pdf+书源代码

    不须要积分,免费放送 Android从入门到精通的pdf,入门的好书籍,因为csdn文件大小的限制所以分成了两部分. part1地址:http://download.csdn.net/detail/a ...

  9. 设计模式笔记之三:Android DataBinding库(MVVM设计模式)

    本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236908&idx=1&sn=9e53 ...

  10. 教我徒弟Android开发入门(一)

    前言: 这个系列的教程是为我徒弟准备的,也适合还不懂java但是想学android开发的小白们~ 本系列是在Android Studio的环境下运行,默认大家的开发环境都是配置好了的 没有配置好的同学 ...

随机推荐

  1. LINUX 笔记-crontab命令

    用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minute   hour   da ...

  2. Python学习笔记(五)--Python数据类型-数字及字符串

    Python数据类型:123和'123'一样吗?>>> 123=='123'False>>> type(123)<type 'int'>>> ...

  3. LeetCode 405. Convert a Number to Hexadecimal (把一个数转化为16进制)

    Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s compl ...

  4. LeetCode 120. Triangle (三角形)

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  5. LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  6. c++连接数据库 在vc6.0

    配置相关环境 我的mysql安装路径为E:\mysql-5.5.28-win32所以要在VC中设置include路径和lib的路径. 添加MySql的include目录到VC工作台中Project-& ...

  7. Java:什么是面向对象?

    1.首先我们去区分对象的属性和方法. 一).什么是对象? 比如:所有的东西都可以叫做对象.而对象就是提供给我们研究对象,这就是对象. 二).怎么区分"属性"和"方法&qu ...

  8. Ionic3 启动非常慢

    优化: ionic cordova build android --prod --release

  9. IOS学习——iphone X的适配

    说实话,对于一个刚入门iOS两个月的新手而言,在拿到这个任务的时候整个人都是懵逼的,怎么做适配?哪些地方需要适配?该怎么做?一个个问题搞得头都大了. 首先,啥都不管,先在iPhone X上运行起来看看 ...

  10. transform 各种影响

    1.提升元素的z-index层级,下面这个例子会让前面的图片显示在上面,一般来说应该是后面的覆盖前面图片的 <img src="mm1" style="-ms-tr ...