Android DataBinding之初体验
(一)
关于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);}复制代码
- 将layout和Activity绑定
- 创建一个实体
- 将实体和布局关联起来
运行
上面简单几步,创建了一个DataBinding App现在运行起来,看看效果。
事件处理
上面只是一个简单的示例,毕竟没有人写一个只做展示而没有交互的应用,有交互必然有事件处理。DataBinding同样可以处理这些。
- 方法引用
- 监听绑定
方法引用
- 定义一个类
public class MyHandlers {public void onClickFriend(View view) { Toast.makeText(view.getContext(), "Hello World", Toast.LENGTH_SHORT).show();}}复制代码
- 修改布局文件
<?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中调用函数, - 赋值
@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+上才能使用。
- 定义监听类
Task表示回调参数public class Presenter {public void onSaveClick(Task task){}}复制代码
- 修改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<MyUser>"/><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之初体验相关推荐
- 鸟枪换炮,Android Studio的初体验——Android Studio系列(一)
转载请注明出处:http://blog.csdn.net/chengbao315/article/details/51130757 使用Eclipse开发安卓已经一个月了,对Eclipse环境基本可以 ...
- Android车机初体验
/ 今日科技快讯 / 继四月底.5月初连续减持京东健康价值超过4.4亿港元(约合3.76亿人民币)股票后,近日,刘强东又减持京东价值约2.79亿美元股票.约合人民币18.71亿元.减持前,刘强 ...
- Android 车机初体验:Auto,Automotive 傻傻分不清楚?
原创作者:小虾米君 转载地址:https://mp.weixin.qq.com/s/3OL8boekmBId0UVU6amp8A WWDC 2022 上野心勃勃的 CarPlay 让不少车企感受了更多 ...
- android 人生日历,人生日历Android版 功能初体验
千呼万唤始出来,人生日历终于发布手机Android版本了.下面跟随小编一起体验一下它的各个功能吧. 在手机屏幕上打开人生日历,进入程序之后,就会出现如下界面.进入界面简单美观,淡蓝色底色调,延续了人生 ...
- Android 车机初体验: Auto,Automotive 傻傻分不清楚?| 开发者说·DTalk
本文原作者: 小虾米君,原文发布于: TechMerger WWDC 2022 上野心勃勃的 CarPlay 让不少车企感受了更多可能,也让不少车企察觉到了危机. Google 亦在车机上早有布局,包 ...
- android 人生日历,人生日历Android版功能初体验
千呼万唤始出来,人生日历终于发布手机Android版本了.下面跟随小编一起体验一下它的各个功能吧. 在手机屏幕上打开人生日历,进入程序之后,就会出现如下界面.进入界面简单美观,淡蓝色底色调,延续了人生 ...
- Android测试之Monkey初体验
什么是Monkey? Monkey是Android中自带的用来进行压力测试的一个命令行工具. 用Monkey进行App压力测试的结果有三种 正常 Crash :程序崩溃 ANR:程序无响应 Monke ...
- 【android】ActivityGroup初体验
接触android能有快一年了吧,做过的应用确是寥寥无几,只能说,这个公司管理比较混乱,要么没活可做,要么一来就来急活-- 这次据说来了个大项目,让尽快完成,结果呢? 画面部分给了只有2/3不到吧(按 ...
- Android Studio之初体验 ---- 很好很强大
转载请注明出处:http://blog.csdn.net/crazy1235/article/details/41702277 一.介绍 很多android 开发者都感叹做android开发竟然都没有 ...
最新文章
- matlab画复变函数,科学网—复数复变函数的Matlab计算与绘图 - 周铁戈的博文
- “坑爹”排行榜:Java语言最违反常识的功能点TOP 10
- 从Atlas到Microsoft ASP.NET AJAX(4) - Browser Compatibility
- Struts1.2的框架验证
- javascript 数字格式化
- K-means算法详解及python代码实现
- 奖金67万!2020 中国计算机学会大数据与计算智能大赛启动!
- 笔记:制作游戏所需的数学
- 倒车出库何时开始打方向盘,车头似乎很容易撞到左右两侧的车?
- 在c#中使用全局快捷键
- Report Builder:SRW包
- mysql 核对_mysql索引 (校验规则引发的血案)
- “蓝桥杯”练习系统练习题答案(自己做的)
- Cisco 路由器破解密码
- 【资源篇】在线下载B站视频(免安装)
- 只会环比下降3%的数据分析师还有救吗?
- 高新技术背景下超大城市垃圾处理的成本控制研究
- 计算机游戏玩法,123木头人游戏规则与玩法
- 2022-2027年中国喷涂机器人行业市场调研及未来发展趋势预测报告
- 链家网爬取深圳租房分析