欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DataBinding---MVVM模式

程序员文章站 2022-05-14 23:47:03
...

简介

Data binding 是Google在2015年7月发布的Android Studio v1.3.0 版本上引入的,在2016年4月Android Studio v2.0.0 上正式支持。引入之初,不支持双向绑定,目前已经支持了。
DataBinding 是基于MVVM思想实现数据和UI绑定的的框架,有了 Data Binding,在Android中也可以很方便的实现MVVM。
在引入DataBinding之前,我们需要敲很多很鸡肋的代码,如 findViewById()、setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通过 Data Binding , 我们可以通过声明式布局以精简的代码来绑定应用程序逻辑和布局,这样就不用编写大量的毫无营养的代码了。
DataBinding 是一个support库,最低支持到Android 2.1(API Level 7+)

环境构建

1、先下载最新的 Support repository和Google Repository,如果在引入过程中报如下错误,一把就是由于没有升级前两个库造成的
DataBinding---MVVM模式DataBinding---MVVM模式
2、在Module的build.gradle文件中的android节点下做如下配置:
DataBinding---MVVM模式DataBinding---MVVM模式

3、要求
Android Plugin for Gradle: 1.5.0-alpha1及以上
Android Studio 1.3
及以上

具体使用方式

简单数据绑定

1、布局文件将更节点变为layout节点并引入data节点,同时创建好需要用到的Model
  1. <layout xmlns:android=“http://schemas.android.com/apk/res/android”
  2. xmlns:tools=“http://schemas.android.com/tools”>
  3. <data>
  4. <variable
  5. name=“user”
  6. type=“com.victor.databinding.User”/>
  7. </data>
  1. public class User {
  2. public String firstName;
  3. public String lastName;
  4. public String phone; // 电话
  5. public boolean isShowPhone;
  6. /**
  7. * 获取全名
  8. * @param firstName
  9. * @param lastName
  10. * @return
  11. */
  12. public String getFullName(String firstName, String lastName) {
  13. StringBuilder sb = new StringBuilder();
  14. sb.append("全名:");
  15. if (!TextUtils.isEmpty(firstName)) {
  16. sb.append(firstName);
  17. }
  18. if (!TextUtils.isEmpty(lastName)) {
  19. sb.append("." + lastName);
  20. }
  21. return sb.toString();
  22. }
  23. }

其中data节点下一个variable节点代表一个变量,name属性根据需要自己取名,type为需要用到的Model的全路径,功能相当于写代码的时候引入一个类的功能

2、在Activity中,用 DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentView(int layoutId),同时初始化数据,并进行绑定
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. // 要用setContentView(Activity activity, int layoutId)代替该方法
  6. //setContentView(R.layout.activity_main);
  7. ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
  8. // 初始化数据
  9. User user = new User();
  10. user.firstName = “Victor”;
  11. user.lastName = “Fang”;
  12. user.phone = “13333333333”;
  13. user.isShowPhone = false;
  14. // 绑定数据
  15. binding.setUser(user);
  16. }
其中ActivityMainBinding是根据你绑定的布局文件的名称去掉下划线后加上Binding,由系统自动生成。

3、在布局文件中使用数据绑定
  1. <TextView
  2. android:layout_width=“wrap_content”
  3. android:layout_height=”wrap_content
  4. android:text=”@{user.firstName}”/>
其中user就是你第一步定义data节点下的变量(variable)中name属性值。firstName是Model中的变量名
将app跑起来就能看到TextView已经能展示数据了
DataBinding---MVVM模式DataBinding---MVVM模式

三元表达式

DataBinding还支持三元表达式功能,如在布局文件中添加如下节点
但是需要注意的是:引用了API原有的类,如View,是需要通过import节点导入的,不然会报错
  1. <data>
  2. <!–<import type=”com.victor.databinding.User”/>–>
  3. <import type=“android.view.View”/>


  1. <!– 三元表达式 –>
  2. <TextView
  3. android:layout_width=“wrap_content”
  4. android:layout_height=“wrap_content”
  5. android:text=“@{user.phone}”
  6. android:visibility=“@{user.isShowPhone ? View.VISIBLE : View.GONE}”/>
一开始我们初始user的时候,isShowPhone = false,所以不会看到有电话号码显示(下左图),如果我们将isShowPhone改为true,显示如下右图
DataBinding---MVVM模式DataBinding---MVVM模式DataBinding---MVVM模式DataBinding---MVVM模式

方法事件绑定

DataBinding除了支持数据绑定外,还可以绑定方法和监听事件

普通方法的绑定,直接在布局文件中,通过变量名调用方法即可,和java代码里面使用相似
  1. <!–类方法的绑定–>
  2. <TextView
  3. android:layout_width=“wrap_content”
  4. android:layout_height=“wrap_content”
  5. android:text=“@{user.getFullName(user.firstName, user.lastName)}”/> <!–调用User类里面的获取全名的方法–>
显示效果:
DataBinding---MVVM模式
DataBinding---MVVM模式
事件绑定
类似于 android:onClick 可以指定 Activity 中的函数,Data Binding 也允许处理从视图中发送的事件。两种实现方式:
方法调用监听绑定
二者主要区别在于方法调用在编译时处理,而监听绑定于事件发生时处理。
方法调用
  1. <!–事件绑定–>
  2. <Button
  3. android:layout_width=“wrap_content”
  4. android:layout_height=“wrap_content”
  5. android:text=“ShowToast”
  6. android:onClick=“@{handler::showTost}”/>
其中用的handler类创建后也许通过data节点下引入
  1. public class MyHandler {
  2. public void showTost(View view) {
  3. Toast.makeText(view.getContext(), “展示吐司”, Toast.LENGTH_SHORT).show();
  4. }
  5. public void onEventListenerExecute(MyTask task) {
  6. task.run();
  7. }
  8. }


  1. <variable
  2. name=“handler”
  3. type=“com.victor.databinding.MyHandler”/>
这样不用再代码里面写任何事件监听的代码,就能够相应按钮的点击事件
DataBinding---MVVM模式
监听绑定
需要注意的是:此功能在 Android Gradle Plugin version 2.0 或更新版本上可用,支持lambda表达式
在方法引用中,方法的参数必须与监听器对象的参数相匹配。
在监听绑定中,只要返回值与监听器对象的预期返回值相匹配即可
布局文件
  1. <!– 监听绑定 使用lambda表达式 –>
  2. <Button
  3. android:layout_width=“wrap_content”
  4. android:layout_height=“wrap_content”
  5. android:text=“runTask”
  6. android:onClick=“@{() -> handler.onEventListenerExecute(task)}”/>
Task类如下
  1. public class MyTask implements Runnable {
  2. private Context mContext;
  3. public MyTask(Context context) {
  4. mContext = context;
  5. }
  6. @Override
  7. public void run() {
  8. Toast.makeText(mContext, “执行任务”, Toast.LENGTH_SHORT).show();
  9. }
  10. }
展示效果:
相关标签: databinding