Android学习之MVVM开发模式
来源:互联网 发布:数据库中关系的定义 编辑:程序博客网 时间:2024/05/07 05:32
MVVM简介
之前使用过MVP模式来写项目, 已经基本会用了,是时候学学MVVM了。MVVM是Model-View-ViewModel的简写。它是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View上。
在Android中,MVVM 设计模式是使用Data Binding实现的(官网传送门:DataBinding文档地址,需要科学上网;或者DataBinding国内文档地址,可直接访问),下面就来看如何使用吧:
要使用Data Dinding,先要确定你的Android Studio版本,只有在1.3以上的版本才支持,然后要在gradle文件中添加如下几行代码来开启databinding:
android { .... dataBinding { enabled = true }}
然后就可以开始使用了:
一、基本使用
1、布局:最外层变成了layout,如下:
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.guifa.databindingdemo.User" /> </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="@{user.firstName}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.lastName}" /> </LinearLayout></layout>
其中在layout中引入data使用节点,在data中定义variable节点,name表示变量的名称,type表示变量的类型,也就是我们的javabean。
2、编写Java对象类(POJO)for User:
package com.guifa.databindingdemo;/** * Created by GuiFa on 2017/11/3 */public class User { private 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; }}
3.绑定数据
package com.guifa.databindingdemo;import android.databinding.DataBindingUtil;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import com.guifa.databindingdemo.databinding.ActivityMainBinding;/** * @author GuiFa * @description * @date 2017/11/3 */public class MainActivity extends AppCompatActivity { @Override protected 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); }}
其中的 ActivityMainBinding 类是 DataBinding 框架为我们自动生成的 , 它是根据我的XML 文件名字生成的 , 比如我的 XML 文件名字是 activity_main,那么生成的类就会取消下划线并且在最后加上 Binding 就得到了 ActivityMainBinding。这个类的实例可以通过 DataBindingUtil.setContentView 来得到。这个类里面有我们 XML 文件里所有的控件信息,由此 , 也再也不需要去 findViewById 了。
最后直接运行项目,便可以将内容显示在UI界面上了,如下图:
二、事件处理
下面举个例子,给一个Button添加点击事件:
1、创建个MyHandlers类并定义点击方法,方法中我定义了个toast:
package com.guifa.databindingdemo;import android.view.View;import android.widget.Toast;/** * @author GuiFa * @version V1.0 * @date 2017/11/8 */public class MyHandlers { public void onClickFriend(View view) { Toast.makeText(view.getContext(), "点击测试", Toast.LENGTH_SHORT).show(); }}
2、在节点中添加variable:
<data> // ... <variable name="handlers" type="com.guifa.databindingdemo.MyHandlers" /></data>
3、添加布局文件并添加onClick属性
<Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{handlers::onClickFriend}" android:text="点击测试" />
其中onCLick是这么定义的:@{}是固定形式,handlers是上边variable中定义的name,加上“::”,后面跟上自己定义的方法的名字。(官方文档给出的是“::”,实际些项目的时候也可以使用“.”,即android:onClick=”@{handlers.onClickFriend}”)
4、在activity中添加代码:
package com.guifa.databindingdemo;import android.databinding.DataBindingUtil;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import com.guifa.databindingdemo.databinding.ActivityMainBinding;/** * @author GuiFa * @description * @date 2017/11/3 16:18 */public class MainActivity extends AppCompatActivity { @Override protected 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); MyHandlers myHandlers = new MyHandlers(); binding.setHandlers(myHandlers); }}
最后运行起来就能看到toast效果了。
三、加载图片
ImageView加载网络图片时,可以使用DataBinding的扩展,我们可以自定义属性,@BindingAdapter 就可以现实:
1、在节点中添加variable:
<data> // ... <variable name="imageUrl" type="String" /></data>
3、添加布局文件并添加自定义属性“app:image=“””
<ImageView android:layout_width="match_parent" android:layout_height="wrap_content" app:image="@{imageUrl}" />
4、写加载图片的方法,这里我使用了glide加载图片的框架,同时加上“@BindingAdapter({“image”})”
package com.guifa.databindingdemo;import android.databinding.BindingAdapter;import android.widget.ImageView;import com.bumptech.glide.Glide;/** * @author GuiFa * @version V1.0 * @date 2017/11/17 */public class LoadImage { @BindingAdapter({"image"}) public static void imageLoader(ImageView imageView, String imageUrl) { Glide.with(imageView.getContext()).load(imageUrl).into(imageView); }}
5.在MainActivity中添加代码:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);// 加载网络图片binding.setImageUrl("http://timgsa.baidu.com/timgimage&quality=80&size=b9999_10000&sec=1510907859844&di=963a9e3a88b59553d3e4873911cec47e&imgtype=0&src=http%3A%2F%2Fimg.qqzhi.com%2Fupload%2Fimg_5_2322916868D349000605_23.jpg");
未完待续……
- Android学习之MVVM开发模式
- Android开发模式MVVM之DataBinding
- Android开发中的MVVM模式
- Android MVVM开发模式实践
- Android之MVVM开发模式和DataBinding的简单用法
- Android设计模式之MVVM
- iOS开发之MVVM设计模式
- Android 基于MVC的MVVM模式开发
- android MVVM开发模式(一)
- android MVVM开发模式(二)
- android MVVM开发模式(三)
- Android开发模式:MVP Vs MVVM
- 学习android的MVVM设计模式
- Android开发之MVVM新姿势探索
- 玩转Android之MVVM开发模式实战,炫酷的DataBinding!
- Android开发模式之MVC,MVP和MVVM的简单介绍与区别
- Android开发模式之MVC,MVP和MVVM的简单介绍与区别
- 玩转Android之MVVM开发模式实战,炫酷的DataBinding!
- 手码VGG16网络
- win7下用Intelij IDEA 远程调试spark standalone 集群
- locate命令安装
- map reduce解决数据不平衡问题
- python中什么是*args和**kwargs?
- Android学习之MVVM开发模式
- 身份证扫描识别/身份证OCR识别的正确姿势,你get到了吗?
- 为何和如何学习MarkDown
- 美术常见问题汇总
- 《汇编语言》(王爽)检测点2.1
- file_get_contents 超时 参数 stream_context_create()
- 敌兵布阵(线段树)
- 1033. To Fill or Not to Fill (25)
- Laravel框架学习(Request请求数据、Cookie、文件上传)