What`s DBL
Google IO may, 2015,Android M Preview:
- ASD(Android Support Design)
- APL(Android Percent Layout)
- DBL(Data Binding Library)
ASD(Android Support Design)
- Navigation View 抽屉导航
- nput Edittext Lable 输入框控件的悬浮标签
- Floating Action Button 悬浮操作按钮
- Snackbar 显示在屏幕的底部,包含了文字信息与一个可选的操作按钮,是轻量级的,快速的反馈
- TabLayout 选项卡,与viewpager一起使用
- CoordinatorLayout 手势, 以及滚动,Design library中的很多控件都利用了它
- Collapsing Toolbar 可伸缩折叠的Toolbar
APL(Android Percent Layout)
百分比的layout
What`s DBL
DBL(Data Binding Library),最早是微软提出来的,winphone已经使用多年,这个框架是站在开发者这边的,是开发者更高效系统的开发程序。
原理:遍历contentView得到View数组对象,然后通过数据绑定library生成对应的Binding类,自动的替我们生成了
DBL 即MVVM框架
Why DBL
无论是MVC MVP MVVM 模式都是为了隔离样板代码
- DBL 接管Presenter(MVP),个人认为MVP学习成本比较高,而且耦合度高
- DBL实现view中数据的所有绑定和更新操作
- The Data Binding Library offers both flexibility and broad compatibility
- Model-View-View-Model,View和Model的双向绑定
- 当数据更新,框架收到通知,视图可以自动更新,View和Model可以做到松耦合
- 减轻Activity和Fragment的压力
- 减少代码行数,简洁,易读性,findviewbyid,只需遍历一次
- Butterknife,Ahibernate,Afinal,注解拖慢解析速度,DBL不会
- 官方说会提高xml的解析速度
- 可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性
Use DBL
- platform: Android 2.1 (API level 7+)
- dataBinding{
enabled = true
}
|
简单小栗子
|
如何编写xml
想怎么写就怎么写~
支持的表达式
表达式
Mathematical + - / * % 算术运算
String concatenation + 字符串连接
Logical && || 逻辑运算
Binary & | ^ 二进制
Unary + - ! ~ 一元运算
Shift >> >>> << 位运算
Comparison == > < >= <= 关系运算符
instanceof 类型比较
Grouping () 组
Literals - character, String, numeric, null 复数常量
Cast 类型转换
Method calls 方法调用
Field access 字段访问
Array access [] 数组存取
Ternary operator ?: 三元运算
如何赋值
当然是在java代码里面赋值啦 ~
绑定事件
|
动态赋值实例1:
那么,到现在为止,绑定,编写,赋值,事件,已经Ok了,但是还远远不能满足我们的需求,我们的业务逻辑往往是复杂的。
庆幸的是DataBinding也支持内容观察者,observe,而且使用起来也相当方便。
分3步:
- 在getter()方法上添加注解:@Bindable
- Bindable注解会自动生成一个entry类:BR (AS1.5不自动生成,AS2.2自动生成,不知原因)
- 在setter方法里,通知UI更新数据:notifyPropertyChanged(BR.appName)
|
动态赋值实例2
其实使用BaseObservable已经基本够用,但是Google还给我们封装了一系列的数据结构Observable Collections,使用起来也更爽一些。主要使用get()和set()取存。
BaseObservable Subclasses
ObservableBoolean, ObservableByte, ObservableChar, ObservableDouble, ObservableField<T>, ObservableFloat, ObservableInt, ObservableLong,ObservableShort, ObservableArrayMap,ObservableArrayList
动态赋值实例3
ObservableFields的使用方法就更加简单了,例如下面代码:
动态赋值实例4
addOnPropertyChangedCallback
使用view ID
|
ViewStubProxy
ViewStub , View的嵌套,因为viewstub与其他view不同,viewstub一开始是不可见的,实际上是不存在与view的结构中,所以要监听OnInflateListener,来设置binding。
Include
|
注意:name.xml和contact.xml里面必须声明User,另外,不支持merge
ListView
可以看到代码里,没有viewHolder的身影了,我们再也不用写一堆代码了。
RecyclerView
|
Noting is perfect
我们的业务逻辑各种各样,也比较复杂
- 在xml文件里写表达式的方式,对于view的测试是有些困难的,所以我们可以把一些逻辑写入model类
- 对于一些复杂的view,显得比较笨重
- 找不到BR文件,clean,你懂得
- Android Studio may say: annot resolve symbol , 有些符号还不是支持的很好BR,但是不妨碍编译
- Android Studio 提示找不到binder,绝大多数是xml写的有问题,没有generate成功object
- xml里面的变量要全路径书写:java.util.List
not List - 临时更改xml的时候,编译器会报一些编译的错误,忽略之
- text不要写入int类型,String.valueOf 很有必要
- 有的时间BR要写全路径
- 如果viewmodel中包含{import android.content.Context;} , 那么说明你用错了,内存泄露
- 出现bug很难定位问题所在,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题
不管mvc,mvp,mvvm都只是个工具,敢于拥抱新的技术,但也不能盲从,如phonegap,jQuerymobile,然并卵
倒计时Demo
|