(一)

关于DataBinding

Google推出DataBinding有一段时间,但是目前来看没有几个人用(尴尬),当然Google推出很多东西都没用户(哈哈),不过作为程序猿
学习这个东西还是很有必要的,毕竟技术的革新都是在一点点试错中发展壮大。此系列参考官方文档。
说明:
支持:Android 2.1 (API level 7+)
要求:Gradle插件至少1.5.0-alpha1或更高,Android Studio 1.3+

构建环境

使用之前要先从Support respository下载支持包,不过现在基本上都有的,没有support还怎么玩。
让后在app模块的build.gradle中添加如下:

    android {....dataBinding {enabled = true}}复制代码

注意:如果使用了library,而这个库使用了databinding,主模块也要配置。

布局文件

databinding的布局文件是区别于传统的layout文件,跟节点是以layout开头的,e.g.

    <?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variable name="user" type="com.example.User"/></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.firstName}"/><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.lastName}"/></LinearLayout></layout>复制代码

data节点中定义变量名称,type是变量的类型(全名:包名+类名)。
而使用这个变量类似:

    <TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.firstName}"/>复制代码

Data Object

上面已经写好了布局文件,已经定义了user变量,下面我们就定义一个User类,

    public class User {// public final public final String firstName;public final String lastName;public User(String firstName, String lastName) {this.firstName = firstName;this.lastName = lastName;}}复制代码

这样写的实体通常是不会变化的,就跟我们平日写的JavaBean一样,但是字段必须是public和final的,还有另一种写法

    public class User {// private final 但是有getterprivate final String firstName;private final String lastName;public User(String firstName, String lastName) {this.firstName = firstName;this.lastName = lastName;}public String getFirstName() {return this.firstName;}public String getLastName() {return this.lastName;}}复制代码

绑定数据

默认定义好了layout就会生成一个以“Binding”结尾同名的丙丁对象,让后通过DataBindingUtil来将layout和Activity绑定。

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);User user = new User("Test", "User");binding.setUser(user);}复制代码
  1. 将layout和Activity绑定
  2. 创建一个实体
  3. 将实体和布局关联起来

运行

上面简单几步,创建了一个DataBinding App现在运行起来,看看效果。

事件处理

上面只是一个简单的示例,毕竟没有人写一个只做展示而没有交互的应用,有交互必然有事件处理。DataBinding同样可以处理这些。

  1. 方法引用
  2. 监听绑定

    方法引用

  3. 定义一个类
     public class MyHandlers {public void onClickFriend(View view) { Toast.makeText(view.getContext(), "Hello World", Toast.LENGTH_SHORT).show();}}复制代码
  4. 修改布局文件
     <?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variable name="handlers" type="com.example.Handlers"/><variable name="user" type="com.example.User"/></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.firstName}"android:onClick="@{handlers::onClickFriend}"/></LinearLayout></layout>复制代码

    data节点申明变量,和类型
    andorid:onClick中调用函数,

  5. 赋值
     @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);User user = new User("Test", "User");binding.setUser(user);binding.setHandlers(new MyHandlers()); // 给变量赋值}复制代码

    这样我们的时间就绑定好了,我们运行点击,就会弹出Toast。
    说明:如果没有赋值,不会报错,也不会弹出Toast,相当于没有绑定事件。

监听绑定

这种方式只有在Gradle插件version 2.0+上才能使用。

  1. 定义监听类
    Task表示回调参数

     public class Presenter {public void onSaveClick(Task task){}}复制代码
  2. 修改layout文件
       <?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variable name="task" type="com.android.example.Task" /><variable name="presenter" type="com.android.example.Presenter" /></data><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"><Button android:layout_width="wrap_content" android:layout_height="wrap_content"android:onClick="@{() -> presenter.onSaveClick(task)}" /></LinearLayout></layout>复制代码

    android:onClick="@{() -> presenter.onSaveClick(task)}" /> 使用lambda表达试,也可以使用下面方式
    android:onClick="@{(view) -> presenter.onSaveClick(task)}"
    两种方式各有特点,根据自己需要来选择。

(二)

上节我们讲了基本使用,这节我们继续讲讲已谢基本用法
说明:前期文章参考官方文档,因为基础知识官方写的很清楚。

导包

基本定义

上节我们使用了一下基础导包,定义一个变量,如:

<variablename="user"type="com.lowett.databinding.User"/>复制代码

这样写有个问题,当有多个同样类型的变量时候,就显得比较麻烦了,这里DataBinding库提供了另一中方式
可以先导包,然后在定义变量,

<data><import type="android.view.View"/><!--导入User--><import type="com.lowett.databinding.User"/><!--定义变量--><variablename="user"type="User"/><variablename="listner"type="com.lowett.databinding.HandleClick"/></data>复制代码

定义别名

如果类冲突,我们还可以定义别名。

<data><import type="android.view.View"/><!--导入User 并定义别名--><import type="com.lowett.databinding.User" alias="MyUser"/><!--定义变量--><variablename="user"type="MyUser"/><variablename="listner"type="com.lowett.databinding.HandleClick"/></data>复制代码

范型定义

在Java中我们可以定义范型,在layout同样可以,但是其中的括号需要特俗定义否则会报错。

<data><import type="java.util.List"/><import type="android.view.View"/><!--导入User 并定义别名--><import type="com.lowett.databinding.User" alias="MyUser"/><!--定义变量--><variablename="user"type="MyUser"/><!--定义范型, 如果显示红色没关系可以编译成功--><variablename="users"type="List&lt;MyUser&gt;"/><variablename="listner"type="com.lowett.databinding.HandleClick"/></data>复制代码

静态方法

导入类型的时候我们也可导入工具类等的静态方法。

<data><import type="com.lowett.databinding.utils.Utils"/>
</data>复制代码

使用:

<TextViewandroid:layout_width="wrap_content"android:text="@{Utils.test()}"android:layout_height="wrap_content"/>复制代码

默认导入的变量

在layout中有默认导入几种常用的类型,比如String,Context等,这些何以直接使用,如果显式指定了类型将会修改掉默认的。
在layout中还有一个context变量可以直接使用。
如我们获取屏幕尺寸:
注意:需要讲int转换为String。
这里并没有定义context,以及导入String包,默认有。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><import type="com.lowett.databinding.utils.Utils"/></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:text="@{String.valueOf(Utils.getScreenWidth(context))}"android:layout_height="wrap_content"/></LinearLayout>
</layout>复制代码

Utils.java:

public class Utils {public  static String test() {return "Test";}public static int getScreenWidth(Context context) {return context.getResources().getDisplayMetrics().widthPixels;}
}复制代码

自定义类名

默认的我们生成的binding类名是以布局文件的名字接一个Binding为后缀,我们也可以修改这个名字。
如:

<data class="MyDataClass"></data>复制代码

在布局文件中data节点天街class属性并定义名字,生成MyDataClass绑定对象。位于跟包名下。
如果向指定包名,那么写全名即可。

<data class="com.lowett.databinding.utils.MyDataClass"></data>复制代码

这样将会在com.lowett.databinding.utils下面生成绑定类。

参考官方文档。
未完待续

Android DataBinding之初体验相关推荐

  1. 鸟枪换炮,Android Studio的初体验——Android Studio系列(一)

    转载请注明出处:http://blog.csdn.net/chengbao315/article/details/51130757 使用Eclipse开发安卓已经一个月了,对Eclipse环境基本可以 ...

  2. Android车机初体验

    /   今日科技快讯   / 继四月底.5月初连续减持京东健康价值超过4.4亿港元(约合3.76亿人民币)股票后,近日,刘强东又减持京东价值约2.79亿美元股票.约合人民币18.71亿元.减持前,刘强 ...

  3. Android 车机初体验:Auto,Automotive 傻傻分不清楚?

    原创作者:小虾米君 转载地址:https://mp.weixin.qq.com/s/3OL8boekmBId0UVU6amp8A WWDC 2022 上野心勃勃的 CarPlay 让不少车企感受了更多 ...

  4. android 人生日历,人生日历Android版 功能初体验

    千呼万唤始出来,人生日历终于发布手机Android版本了.下面跟随小编一起体验一下它的各个功能吧. 在手机屏幕上打开人生日历,进入程序之后,就会出现如下界面.进入界面简单美观,淡蓝色底色调,延续了人生 ...

  5. Android 车机初体验: Auto,Automotive 傻傻分不清楚?| 开发者说·DTalk

    本文原作者: 小虾米君,原文发布于: TechMerger WWDC 2022 上野心勃勃的 CarPlay 让不少车企感受了更多可能,也让不少车企察觉到了危机. Google 亦在车机上早有布局,包 ...

  6. android 人生日历,人生日历Android版功能初体验

    千呼万唤始出来,人生日历终于发布手机Android版本了.下面跟随小编一起体验一下它的各个功能吧. 在手机屏幕上打开人生日历,进入程序之后,就会出现如下界面.进入界面简单美观,淡蓝色底色调,延续了人生 ...

  7. Android测试之Monkey初体验

    什么是Monkey? Monkey是Android中自带的用来进行压力测试的一个命令行工具. 用Monkey进行App压力测试的结果有三种 正常 Crash :程序崩溃 ANR:程序无响应 Monke ...

  8. 【android】ActivityGroup初体验

    接触android能有快一年了吧,做过的应用确是寥寥无几,只能说,这个公司管理比较混乱,要么没活可做,要么一来就来急活-- 这次据说来了个大项目,让尽快完成,结果呢? 画面部分给了只有2/3不到吧(按 ...

  9. Android Studio之初体验 ---- 很好很强大

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/41702277 一.介绍 很多android 开发者都感叹做android开发竟然都没有 ...

最新文章

  1. matlab画复变函数,科学网—复数复变函数的Matlab计算与绘图 - 周铁戈的博文
  2. “坑爹”排行榜:Java语言最违反常识的功能点TOP 10
  3. 从Atlas到Microsoft ASP.NET AJAX(4) - Browser Compatibility
  4. Struts1.2的框架验证
  5. javascript 数字格式化
  6. K-means算法详解及python代码实现
  7. 奖金67万!2020 中国计算机学会大数据与计算智能大赛启动!
  8. 笔记:制作游戏所需的数学
  9. 倒车出库何时开始打方向盘,车头似乎很容易撞到左右两侧的车?
  10. 在c#中使用全局快捷键
  11. Report Builder:SRW包
  12. mysql 核对_mysql索引 (校验规则引发的血案)
  13. “蓝桥杯”练习系统练习题答案(自己做的)
  14. Cisco 路由器破解密码
  15. 【资源篇】在线下载B站视频(免安装)
  16. 只会环比下降3%的数据分析师还有救吗?
  17. 高新技术背景下超大城市垃圾处理的成本控制研究
  18. 计算机游戏玩法,123木头人游戏规则与玩法
  19. 2022-2027年中国喷涂机器人行业市场调研及未来发展趋势预测报告
  20. 链家网爬取深圳租房分析

热门文章

  1. 百度飞桨入选互联网领先科技成果,王海峰:AI进入工业化大生产新阶段
  2. ARM 发布新一代 GPU 架构,还有一个机器学习处理器
  3. 百度不再效仿谷歌,否认分拆阿波罗
  4. 牛津、剑桥、OpenAI 等多家机构发布重磅报告,论述恶意人工智能的「罪与罚」
  5. Gartner 2022年新兴技术和趋势影响力雷达图中五项具有影响力的技术
  6. 一文读懂产业互联网的前世今生!
  7. 中国科学家发现恐惧情绪的新环路
  8. 89页PPT揭秘:人工智能产业爆发的拐点
  9. AlphaGo之后,DeepMind重磅推出AlphaFold:基因序列预测蛋白质结构
  10. 《瓦森纳协定》——光刻机为什么就是不卖给中国!