DataBinding与MVVM(含代码)
来源:互联网 发布:动态称重算法 编辑:程序博客网 时间:2024/05/18 09:06
DataBinding是对MVVM架构的最好诠释,一直以来逻辑,数据模型,和界面之间的关系都没有一个很好的平衡,MVP架构会使大量的逻辑代码都集中在Presenter中,而DataBinding可以很好的平衡这些之间的关系
工程配置
之前看到网上许多资料都是需要配置DataBinding的依赖,但是我使用的是新版的gradle,没有出现需要配置依赖的地方,只需要在gradle(app的gradle)中加入以下代码:
dataBinding { enabled true}
数据对象的绑定
首先新建一个工程,有一个MainActivity以及一个activity_main.xml的布局文件,当然你叫别的名字也无所谓。然后建一个数据模型类,如下:
public class Person extends BaseObservable { private String name; private String age; private String sex; public Person(String name, String age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public void setAge(String age) { this.age = age; } public String getName() { return this.name; } public String getAge() { return this.age; } public void setSex(String sex) { this.sex = sex; notifyPropertyChanged(BR.sex); } public String getSex() { return sex; }}
然后修改布局文件activity_main.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="databind.android.com.testdatabind.Person" /> <variable name="animal" type="databind.android.com.testdatabind.Animal" /> <variable name="person" type="Person" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{person.name}" android:textColor="#000000" android:textSize="18dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{person.age}" android:textColor="#000000" android:textSize="14dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{person.sex}" android:textColor="#000000" android:textSize="14dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{animal.name}" android:textColor="#000000" android:textSize="18dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{animal.age}" android:textColor="#000000" android:textSize="14dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{animal.sex}" android:textColor="#000000" android:textSize="14dp" /> </LinearLayout></layout>
与以往的布局文件不同的是,这类布局文件会有一个data的标签,import的语法与java一样,不过多介绍,variable便是一个变量,在布局文件中定义变量,是不是很稀奇,这正是data binding的核心所在。
接下来我们在对应的activity中添加如下代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); Person person = new Person("umeng share","5"); Animal animal = new Animal("cat","5"); binding.setPerson(person); binding.setAnimal(animal); person.setSex("male"); animal.setSex("female"); }
ActivityMainBinding这个类是根据刚才的布局文件自动生成的,因为刚才布局文件叫activity_main所以自动生成类ActivityMainBinding,如果叫activity_ddd,就会自动生成ActivityDddBinding。
此时运行程序,就会显示对应的字符,没有了findviewbyid是不是清晰多了。
点击事件
如果你认为只有这些功能,那就大错特错了,接下来再看一下如何添加点击事件。
布局中添加如下代码(在哪添加不用说了吧,当然是data标签下):
<variable name="click" type="android.view.View.OnClickListener" />
以及布局中添加:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{click}" android:textColor="#000000" android:textSize="14dp" />
同时我们在Activity中添加如下代码:
binding.setClick(new View.OnClickListener() { @Override public void onClick(View view) { } });
通过以上两个例子可以看出我们可以在java代码中通过binding设置变量的具体内容,然后在布局文件中接受变量的内容,然后通过布局显示出来。
其它类型
除此之外,所有java的集合类数据类型,都可以支持,比如List
我们修改布局文件:
<import type="java.util.ArrayList" /><variable name="list" type="ArrayList<String>" /> <variable name="listKey" type="int" />
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{click}" android:text="@{list[listKey]}" android:textColor="#000000" android:textSize="14dp" />
对应的java代码:
binding.setList(list);binding.setListKey(0);
要注意的是布局文件中<符号会被转义,所以我们用<,在布局文件中会报红,但是不影响编译
方法的调用
我们新建一个方法类:
public class StringUtil { public static String cut( String word) { if (word.length()>4){ word = word.substring(0,4); } return word; }}
在布局文件中可以用如下方式调用:
<import type="databind.android.com.testdatabind.StringUtil" />
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{StringUtil.cut(person.name)}" />
检测变量的变化
在实际应用中,所有的变量不可能是一成不变的,如果变量的值发生变化如何在界面上更新呢?
我们需要修改一下数据模型类:
package databind.android.com.testdatabind.detail;import android.databinding.BaseObservable;import android.databinding.Bindable;import databind.android.com.testdatabind.BR;/** * Created by wangfei on 17/1/1. */public class Person extends BaseObservable { private String name; private String age; private String sex; public Person(String name, String age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); } public void setAge(String age) { this.age = age; notifyPropertyChanged(BR.age); } @Bindable public String getName() { return this.name; } @Bindable public String getAge() { return this.age; } public void setSex(String sex) { this.sex = sex; notifyPropertyChanged(BR.sex); } @Bindable public String getSex() { return sex; }}
在get方法中加上注解@Bindable,同时在set方法中加入 notifyPropertyChanged(BR.xxx);
同时在java文件中,需要变动的地方,直接设置变量的值即可触发界面的变化:
person.setName("点击按钮产生了变化");
什么取代了findViewById
正常编程下我们都是通过findViewById获得布局文件中各组件的对象,那么在data binding下如何获取呢?
其实非常简单,例如有如下布局:
<TextView android:id="@+id/mutable" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{realperson.sex}" android:textColor="#000000" android:textSize="14dp" />
ID是mutable,那么在java文件中的binding会自动生成对应的变量mutable
binding.mutable.setText("点击事件");
表达式
除此之外,还可以在布局文件中运用一些基本的表达式,如下:
<TextView android:text="@{person.sex}" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{person.isMan ? View.VISIBLE : View.GONE"/>
总结
除了上面介绍的基本方法,data Binding当然还有很多高级方法,我们需要在实际应用中去学习,这里只做了简单的介绍,但是不难看出,如果这种方式使用纯熟了,开发界面类应用真的会省去很多麻烦。
我在这里写了一个简单的demo,感兴趣的朋友可以参考一下:
https://github.com/mymdeep/databinding
更多的开发知识,可以关注我的公众号:
- DataBinding与MVVM(含代码)
- DataBinding与MVVM(含代码)
- MVVM + dataBinding
- 【Android】DataBinding库(MVVM设计模式)
- android MVVM DataBinding
- DataBinding实现MVVM
- MVVM之DataBinding
- MvvM 之databinding
- Android DataBinding && MVVM [U04]
- MVVM.DataBinding学习总结
- Android DataBinding & MVVM
- MVVM之DataBinding入门
- Android MVVM框架 DataBinding
- Android MVVM之Databinding(二) 使用篇
- C#WPF窗口显示语音菜单(MVVM,DataBinding)
- Android DataBinding(MVVM设计模式)
- todo-mvvm-databinding源码分析
- 集合遍历与迭代器(含代码)
- linux 常用命令学习 笔记
- MVVM MVC MVP到底是什么
- Hibernate的集中查询方式 : hql查询,QBC查询和QBE查询
- 设计模式(三)——抽象工厂模式
- Android studio 报错:Error:Error: Expected resource of type drawable [ResourceType]
- DataBinding与MVVM(含代码)
- EJB小结
- Android代码的书写规范
- (HDU 5727)Necklace <二部图匹配,匈牙利算法> 多校训练1
- [bigdata-024] 在centos 6.5上手工安装mongodb 3.2.5
- Javascript与Jquery知识点
- 杰瑞·卡普兰:不要期望AlphaGo有人类意识,但需要它像人一样完成任务
- Android dialog 去除虚拟按键
- android复习路之二叉树层次遍历并且分层