1.mvc,mvp,mvvm
- 前面讲了mvc和mvp的框架及其优缺点,如果说mvp是mvc的升级版,那mvvm算是mvp的升级版.但是databinding,绝对是一个程序员梦寐以求的框架,再也不用写
findViewById
了,听着是不是很兴奋.
2. 神作databinding
- 废话不讲了,直接开始,感受神作的魅力
- 先看看以前的写法
- 再看看databinding的写法
3 总结
- 优势
- Activity/Fragment代码量减少(提高开发效率,尤其是findViewById)
- databinding可以判断null值,不会报空指针
- 在布局中可以进行简单的表达式,减少java逻辑代码
- 0反射,全部在编译时期运行,不影响程序运行,性能超过手写代码
- 自动检测空指针,避免crash
- 劣势
- ide支持不完善,有时候需要build一下,建议一起把ide升级到最新,我也不是最新的
- 错误查找不方便
4 DataBinding简单教程
- 在app的build.gradle中添加
android {
...
dataBinding {
enabled = true
}
}
- 修改布局xml文件
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.android.architecture.blueprints.todoapp.demo_mvvm.LoginOutActivity">
<data>
//数据部分
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
//布局部分
</LinearLayout>
</layout>
- 在activity中添加代码,binding xml文件
private ActivityLoginOutBinding activityLoginOutBinding;
//onCreate
activityLoginOutBinding = DataBindingUtil.setContentView(this, R.layout.activity_login_out);
- databinding的使用
<data>
<variable
name="view"
type="com.example.android.architecture.blueprints.todoapp.demo_mvvm.LoginOutActivity"/>
<variable
name="loginoutvm"
type="com.example.android.architecture.blueprints.todoapp.demo_mvvm.LoginOutVM"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
//binding属性, @={loginoutvm.username}表示数据ui双向绑定,ui变->数据变,数据变->ui变
//@{loginoutvm.username} ui数据单向绑定, 数据变->ui变
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="@={loginoutvm.username}"/>
//binding方法
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:text="登录"
android:onClick="@{(v)view->login(v)}"
/>
</LinearLayout>
- databinding处理步骤
开始编译->处理layout文件->解析表达式->java编译->解析依赖->找到setter函数
并且databinding会缓存表达式,减少表达式的计算
只操作一遍findViewById
利用标记来更新数据,减少数据更新频率 - databinding支持的表达式
- 数学表达式: + - / * %
- 字符串拼接 +
- 逻辑表达式 && ||
- 位操作符 & | ^
- 一元操作符 + - ! ~
- 位移操作符 >> >>> <<
- 比较操作符 == > < >= <=
- instanceof
- 分组操作符 ()
- 字面量 - character, String, numeric, null
- 强转、方法调用
- 字段访问
- 数组访问 []
- 三元操作符 ?:
- 聚合判断(Null Coalescing Operator)语法 ‘??’
虽然支持这么多运算符,但还是建议,稍微复杂点的不要放在xml里进行
- databinding支持include
支持
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
bind:user="@{user}"
layout="@layout/name"/>
<include
bind:user="@{user}"
layout="@layout/contact"/>
</LinearLayout>
不支持
<merge>
<include
bind:user="@{user}"
layout="@layout/name"/>
<include
bind:user="@{user}"
layout="@layout/contact"/>
</merge>
- databinding支持动画过度
activityLoginOutBinding.addOnRebindCallback(new OnRebindCallback() {
@Override
public boolean onPreBind(ViewDataBinding binding) {
ViewGroup viewGroup = (ViewGroup) binding.getRoot();
TransitionManager.beginDelayedTransition(viewGroup);
return true;
}
});
- databinding还支持List和Map
<data>
<import type="com.example.User"/>
<import type="java.util.List"/>
<variable name="user" type="User"/>
<variable name="userList" type="List<User>"/>
</data>
*Note: Android Studio does not yet handle imports so the autocomplete for imported variables may not work in your IDE. Your application will still compile fine and you can work around the IDE issue by using fully qualified names in your variable definitions.*
当使用List时候,ide会显示红色,但是能编译,这个是google官网给出的解释