网站构建建设,移动网站建设指南,品牌网站建设 磐石网络官方网站,flash网站源码一、简介 在Vue中使用的是MVVM架构。通过ViewModel可以实现M层和V层数据的双向绑定。Model层的数据发生变化后#xff0c;会自动更新View层UI。UI层数据发生变化#xff08;用户输入#xff09;#xff0c;可以驱动Model层的数据发生变化#xff0c;借助于Vue框架中的View…一、简介 在Vue中使用的是MVVM架构。通过ViewModel可以实现M层和V层数据的双向绑定。Model层的数据发生变化后会自动更新View层UI。UI层数据发生变化用户输入可以驱动Model层的数据发生变化借助于Vue框架中的ViewModel实现数据和UI的双向驱动。 在Android中也想实现数据的双向绑定怎么办呢 JetPack中的DataBinding就充当了ViewModel的角色用来实现数据的双向绑定。
Android app的开发架构从最开始的MVC到MVP到MVVM进一步的解耦。
在Vue中开发者只需维护数据的变化就行数据变化后会自动刷新UI大大提示了开发效率。
Android层面实现MVVM要比在Vue中复杂些需要做的准备工作很多。
在Android中使用DataBinding后不需要再写findVIewById方法也不需要调用VIew的setText
这也就实现了Model层和VIew层的解耦在Vue中也不需要手动操作dom来更新UI。
二、DataBinding在Android中的应用。 1.app项目中开启DataBinding支持默认是关闭的。 builder.gradle ---android节点下配置 dataBinding {enabled true} 2.编写model层代码JavaBean 和编写普通JavaBean除了写get、set方法外有以下不同。 1定义的JavaBean需要继承BaseObservable 类 2在get方法上添加注解BindableDataBinding需要通过注解来解析定义的方法。 3在set方法中添加对应的方法 notifyPropertyChanged(BR.age); notifyPropertyChanged(BR.name);
public class User extends BaseObservable {private String name;private String age;Bindablepublic String getName() {return name;}public void setName(String name) {this.name name;notifyPropertyChanged(BR.name);}Bindablepublic String getAge() {return age;}public void setAge(String age) {this.age age;notifyPropertyChanged(BR.age);}Overridepublic String toString() {return User{ name name \ , age age \ };}
} BR是注解处理器Annotation Processing Tool简称APT解析JavaBean生成的类和android中的R文件类似。编写完JavaBean之后通过Build生成的类 package com.example.jetpack;public class BR {public static final int User 1;public static final int _all 0;public static final int age 2;public static final int name 3;
}通过以上步骤完成了MVVM中model层代码的编写。
3.View层代码的编写。 1在普通的layout布局中按下altenter键选择Convert to data binding layout 把普通的layout转换成 dataBinding规范的layout 转换完之后的样式 1根布局变成了layout。 2多了一个data标签这里面可以定义我们编写的JavaBean类如下 name 定义的是View中引用的字符串可以通过User来获取到里面的值 type定义的是类型 可以是基本类型也可以是自定义类型。 在View中设置值这一步完成了数据与UI的绑定。通过{User.name}
TextViewandroid:idid/nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{User.name}android:textColorcolor/blackandroid:textSize16sp /TextViewandroid:idid/ageandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{User.age}android:textColorcolor/blackandroid:textSize16sp / 2在Activity中 代替常规写法setContentView(R.layout.activity_data_user); 通过DataBindingUtil.setContentView(this, R.layout.activity_data_user);把修改后的layout设置在Activity中返回值是 ActivityDataUserBinding类型他也是通过APT自动生成的类。
ActivityDataUserBinding的实现类就是ActivityDataUserBindingImpl
生成的类名是和定义layout文件名一一对应的。 Activity中完整写法 private User user;private int age 18;private ActivityDataUserBinding dataBinding;Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_data_user);dataBinding DataBindingUtil.setContentView(this, R.layout.activity_data_user);user new User();user.setAge(String.valueOf(age));user.setName(xiaohua);//通过返回的对象把User对象设置进去没有这一步是无法生效的。dataBinding.setUser(user);findViewById(R.id.set_user).setOnClickListener(v - {//修改user的属性值界面会自动刷新。user.setAge(String.valueOf(age));user.setName(xiaohua);});findViewById(R.id.get_user).setOnClickListener(v - {Log.e(nyz, user user.toString());});}
通过以上步骤就完成了Model到View层的数据绑定数据发生变化后UI自动刷新。
4)DataBinding是如何做到UI发生变化自动更新数据的呢非常简单。
通过{User.name} 可以把获取到的值复制给User.name在Java层可以接受到变化后的值。
这样就完成了View到Model的数据绑定 EditTextandroid:idid/name_etandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{User.name} /EditTextandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{User.age} /
具体效果 可以看到调用setValue修改User的name和age时界面中的TextView也跟着更新了做到了数据驱动UI。 当通过修改Edittext中的name和age时TextView中的也更新了这个就是UI变了数据跟着变数据变了UI跟着变。 代码下载 https://download.csdn.net/download/niuyongzhi/88382202