Android - Data Binding

本文深入解析了MVVM设计模式及其在Android中的应用,特别聚焦于Data Binding库的使用,展示了如何通过最少的代码实现声明式布局与逻辑绑定。详细介绍了如何在布局文件中声明变量,绑定数据,并在Activity中进行数据绑定,同时提供了实例代码和关键概念解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考: https://developer.android.com/intl/zh-cn/tools/data-binding/guide.html

  • 1. 什么是MVVM设计模式
MVVM 模式将 MVP模式中的Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。
这里写图片描述
  • 2. Data-Binding介绍
这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件。
Data Binding库不仅灵活而且广泛兼容- 它是一个与support在同一目录下的库 , 谷歌把support库外面又加了一层”exploded-aar” , 这个与support库的功能是一样的,因此你可以在所有的Android平台最低能到Android 2.1(API等级7+)上使用它。
这里写图片描述
  • 3. 构建环境
注 : 需要Android Studio 1.3.0-beta1 或更高版本;

① 项目文件的build.gradle添加如下:

    dependencies {
        classpath "com.android.tools.build:gradle:1.3.0-beta1"
        classpath "com.android.databinding:dataBinder:1.0-rc0"
    }

② 在每一个你想要使用Data Binding的module,添加如下的插件(第一行默认):

apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'
  • 4. 填写布局文件
这里布局文件根节点为 layout , 内部包含 data 节点 , 数据中 variable 代表变量 , type 代表变量类型
    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
       <data>
           <variable name="user" type="com.example.User"/>
       </data>
       <LinearLayout
           android:orientation="vertical"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
           <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>
  • 5. 布局详解

① 在data 内声明了一个user的变量 , 类型一定要写类的全路径名( 这里系统要利用反射 )

<variable name="user" type="com.example.User"/>

② 在子View的text属性写表达式@{} , 下面的属性为user的firstName:

<TextView android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@{user.firstName}"/>
  • 6. 数据Data
* 注 : user的firstName和lastName属性必须是不变的(final) .*

① 属性为public方式创建User:

public class User {
   public final String firstName;
   public final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
}

② 属性为private方式创建User:

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;
   }
}

* 这种私有属性方式创建的User , @{user.firstName} 访问的是User对象的getFirstName()方法 , 而上一中公用属性 则访问的是firstName属性 , 所以Bean中的set和get方法一定要严格按照规范来写*

  • 7. Activity中绑定数据

默认情况下,一个Binding类会基于layout文件的名称而产生,将其转换为Pascal case(译注:首字母大写的命名规范)并且添加“Binding”后缀。上述的layout文件是activity_main.xml,因此生成的类名是ActivityMainBinding。此类包含从layout属性到layout的Views中所有的bindings(例如user变量),并且它还知道如何给Binding表达式分配数值。创建bindings的最简单的方式是在inflating(译注:layout文件与Activity/Fragment的“链接”)期间如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);
}

或者你可以通过如下获取View:

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());

如果你在ListView或者RecyclerView adapter使用Data Binding时,你可能会使用:

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup,false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
* 到这里Demo就演示完成了 , 如果需要更深入理解及扩展请访问 安卓开发官方文档 *

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值