[Module] 06 - DataBinding and MVVM
下一步学习列表:
Android DataBinding使用总结(一) ***
Android DataBinding使用总结(三)列表展示
Android DataBinding使用总结(四)多类型列表展示
Android DataBinding使用总结(五)结合MultiType展示多类型列表
Android MVVM+DataBinding结合Dagger2进行开发
Android 神兵利器Dagger2使用详解(一)基础使用
Android 神兵利器Dagger2使用详解(二)Module&Component源码分析
Android 神兵利器Dagger2使用详解(三)MVP架构下的使用
Android 神兵利器Dagger2使用详解(四)Scope注解的使用及源码分析
前言
Ref: 如何构建Android MVVM应用程序
相关配置
以前我们在Activity里写很多的findViewById,现在如果我们使用DataBinding,就可以抛弃findViewById。DataBinding主要解决了两个问题:
- 需要多次使用findViewById,损害了应用性能且令人厌烦
- 更新UI数据需切换至UI线程,将数据分解映射到各个view比较麻烦
Moudle的build.gradle中添加如下代码进行配置:
android {
....
dataBinding {
enabled = true
}
}
绑定示范
代码:https://github.com/qingmei2/MvvmApp-Android
public class A01MainActivity extends AppCompatActivity {
public Presenter presenter;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
inject(); // ---->
}
private void inject() {
//现在我们通过DataBindingUtil设置布局文件
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
/**
* 以下看上去像是套路coding
*/
//初始化Presenter对象
presenter = new Presenter();
//将presenter对象赋予XML中的 data -> variable -> presenter
binding.setPresenter(presenter);
}
public class Presenter {
public String message = " ~ ";
public void baseDataBinding() {
startActivity(new Intent(A01MainActivity.this, A02DataBindingBaseActivity.class));
}
public void recyclerView(){
startActivity(new Intent(A01MainActivity.this, A03RecyclerBindActivity.class));
}
public void mulTypeRecyclerView(){
startActivity(new Intent(A01MainActivity.this, A04MulTypeRecyclerBindActivity.class));
}
public void mvvm(){
startActivity(new Intent(A01MainActivity.this, A06MvvmActivity.class));
}
public void studyLibrary(){
startActivity(new Intent(A01MainActivity.this, A05MultiTypeStudyActivity.class));
}
}
}
在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"> <data>
<variable
name="presenter"
type="com.mei_husky.samplemvvm.view.activity.A01MainActivity.Presenter" />
</data> <LinearLayout
android:layout_width ="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.mei_husky.samplemvvm.view.activity.A01MainActivity"> <Button
android:layout_width ="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:onClick="@{() -> presenter.baseDataBinding()}"
android:text="@{`DataBinding基础使用` + presenter.message}" /> <Button
android:layout_width ="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:onClick="@{() -> presenter.recyclerView()}"
android:text="@{`DataBinding 展示列表` + presenter.message}" /> <Button
android:layout_width ="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:onClick="@{() -> presenter.mulTypeRecyclerView()}"
android:text="@{`DataBinding 展示多类型列表` + presenter.message}" /> <Button
android:layout_width ="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:onClick="@{() -> presenter.studyLibrary()}"
android:text="@{`MultiType库学习` + presenter.message}" />
<Button
android:layout_width ="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:onClick="@{() -> presenter.mvvm()}"
android:text="@{`DataBinding Mvvm` + presenter.message}" /> </LinearLayout>
</layout>
以上是基本了解,frankly, it is confused.
方案一:ButterKnife
使用 ButterKnife 这个库,能够摆脱讨厌的 findViewById 而获得组件,它让代码更加简洁易读。通过它可以节省很多额外的代码。
private @Bind(R.id.name) TextView mName
private @Bind(R.id.lastName) TextView mLastName
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
//mName = (TextView) findViewById(R.id.name);
//mLastName = (TextView) findViewById(R.id.lastName);
ButterKnife.bind(this);
}
public void updateUI(User user) {
if (user == null) {
mName.setText(null);
mLastName.setText(null);
} else {
mName.setText(user.getName());
mLastName.setText(user.getLastName());
}
}
方案二:holder
使用 Holdr,替你可以处理布局文件,然后为他们创建 View 组件。你通过 Holder,转换 View 的 ID 到组件变量。
private Holdr_ActivityMain holder;
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
holder = new Holdr_ActivityMain(findViewById(content));
}
public void updateUI(User user) {
if (user == null) {
holder.name.setText(null);
holder.lastName.setText(null);
} else {
holder.name.setText(user.getName());
holder.lastName.setText(user.getLastName());
}
}
感觉只是在name, lastname之上wrap了一下而已,未体会到伟大的精神。
当你使用 Data Binding,它很像 Holder 模式,而且你只要做一点点事情,其余的内容 Data Binding 会帮你完成。
方案三:databinding
private ActivityMainBinding mBinding;
protected void onCreate(Bundle savedInstanceState) {
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
} public void updateUI(User user) {
mBinding.setUser(user);
}
id的使用开始变得不重要。
<LinearLayout …>
<TextView android:id="@id/name" />
<TextView android:id="@id/lastName" />
</LinearLayout>
我们能够直接通过 Java 代码找到它们,为什么还需要这些 ID 呢?
所以,进化为如下形式:
<LinearLayout …>
<TextView android:text="@{user.name}"/>
<TextView android:text="@{user.lastName}"/>
</LinearLayout>
看起来更明显。
<layout>
<data>
<variable name="user"
type="com.android.example.User"/>
</data>
<LinearLayout …>
<TextView android:text="@{user.name}"/>
<TextView android:text="@{user.lastName}"/>
<TextView android:text='@{"" + user.age}'/>
</LinearLayout>
</layout>
休息 休息...
[Module] 06 - DataBinding and MVVM的更多相关文章
- 设计模式笔记之三:Android DataBinding库(MVVM设计模式)
本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236908&idx=1&sn=9e53 ...
- Android DataBinding库(MVVM设计模式)
什么是MVVM 说到DataBinding,就有必要先提起MVVM设计模式.Model–View–ViewModel(MVVM) 是一个软件架构设计模式,相比MVVM,大家对MVC或MVP可能会更加熟 ...
- [Design Patterns] 4. Creation Pattern
设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...
- [Arch] 04. Software Architectural Patterns
让我们一起 回忆: 原则 基本认识 S 应该仅有一个引起它变化的原因 O 在不被修改的前提下被扩展 L 尽量从抽象类继承 I 应该依赖于抽象 D 倾向瘦接口 让我们开始 新课: [Design Pat ...
- Android 中的mvvm
我们来了解一下MVVM模式与Databinding ,MVVM是一种模式,Databinding 是一种框架.DataBinding是一个实现数据和UI绑定的框架.而ViewModel和View可以通 ...
- android mvvm
android studio 需要gradle 1.5.0以上才支持 dependencies { classpath 'com.android.tools.build:gradle:1.5.0'} ...
- MVVM 实战之计算器
MVVM 实战之计算器 android DataBinding MVVM calculator Model View 布局文件 Fragment ViewModel 结束语 前些日子,一直在学习基于 ...
- 【Android Jetpack高手日志】DataBinding 从入门到精通
前言 DataBinding 数据绑定库是 Android Jetpack 的一部分,借助该库可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源.我个人觉得,使用 DataBin ...
- Android报错
Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process. ...
随机推荐
- CSS(九):设置盒子水平垂直居中
通过设置下面的样式可以使盒子水平垂直居中: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- java 缩放算法 双线性插值,双三次插值
双线性插值的效果对于放大的图像而言较领域插值来得平滑,但是却使得图像变得模糊而且仍然会有一部分锯齿现象. 双三次插值更好比双线性插值更好. 图像缩放之双三次插值法 数字图像处理之双线性插值
- m2e-wtp error: <path>/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF (No such file or directory)
错误信息: D:\workspace\eclipse\xinfubao\xfb-mgr\target\m2e-wtp\web-resources\META-INF\MANIFEST.MF (系统找不到 ...
- CRNA的使用
为了能让更多人感受 RN 的魅力,早在几个月前 React-community 就给出了一个不错的解决方案,可以让一个完全没接触过 RN 的人,从配环境开始5分钟实现 Hello Wolrd 的编写( ...
- 解决java.lang.IllegalStateException: The application’s PagerAdapter changed the adapter’s content
A界面中有viewpager的动态加载,从界面A跳到界面B,再finish掉B返回A时报出此异常. java.lang.IllegalStateException: The application's ...
- linux进程的挂起和恢复
进程的挂起及恢复 #ctrl+z:挂起,程序放到后台,程序没有结束. #jobs:查看被挂起的程序工作号 恢复进程执行时,有两种选择:fg命令将挂起的作业放回到前台执行:用bg命令将挂起的作业放到后台 ...
- wifi 通过omnipeek 查看 pmf是否生效
给android的wifi设备添加PMF支持时,抓取omnipeek分析. 从assoc req 中发现相关标志位没有使能,说明STA 没有使能PMF RSN Capabilities: %00000 ...
- Java如何中断正在运行的线程?
在Java编程中,如何中断正在运行的线程? 以下示例演示如何使用Thread类的interrupt()方法中断正在运行线程,并检查线程是否使用isInterrupted()方法中断. package ...
- Maven创建Java项目
Maven使用 archetype 来创建项目.要创建一个简单的 Java 应用程序,我们使用 maven-archetype-quickstart 插件.在下面的例子中,我们将创建一个基于Maven ...
- linux 下 vi 文本编辑如何复制一行粘贴删除一行数据
在使用vi有时会想直接复制一行数据,然后粘贴一行或者直接删除一行数据 复制一行数据的方法 把光标放到要复制的一行前面,然后按两下yy字母键 然后把光标放到要复制到的地方去,按键盘的p字母键 删除一行是 ...