Databinding (一) 基本用法

2024-02-28 08:08
文章标签 用法 基本 databinding

本文主要是介绍Databinding (一) 基本用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述
2015 年的 I/O 大会上,Google 发布了官方的数据绑定框架 Data Binding Library,使得官方原生支持 MVVM。

Data Binding 是把数据直接绑定到 XML 文件上,并能实现自动刷新。

Data Binding 减少了代码的耦合性,一些如 findViewById、setText 之类的操作都可以通过绑定实现。

环境配置
环境配置非常简单,只要在 build.gradle 文件里面定义一下代码即可

android {....dataBinding {enabled = true}
}


一个简单的例子
1、首先,定义一个 Java Bean

public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
}


2、然后定义 Layout 文件

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="user"type="com.example.tianjf.myapplication.User" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{String.valueOf(user.age)}" /></LinearLayout>
</layout>


Layout 文件和之前有什么不同呢?

首先,在最外层再套一层 标签。

然后,在 layout 标签下面定义 标签。 
data 标签下面的 variable 定义数据绑定用的实体类。这个实体是从外部传进来的(具体怎么传下文再讲)。 
type 里面是完整的带包名的类, 
name 自定义一个名称,下面具体绑定的时候就是用的这个名称。

最后,用 @{} 来把数据绑定到 UI 上。 
@{user.name} 把 name 属性绑定到第一个 TextView 上。 
@{String.valueOf(user.age)} 把 age 属性绑定到第二个 TextView 上。这里 age 是 int 类型的,所以需要把它转化成 String 类型。由于 String 是属于 java.lang 下面的,所以不需要 import。java.lang 以外的类是需要 import 的(具体怎么 import 下文再讲)。

3、数据绑定 
之前的 Layout 文件的定义会默认生成一个数据绑定类,这个数据绑定类的名称默认和 Layout 文件的类名有关。比如 activity_main.xml 会生成 ActivityMainBinding.java 文件。

我们来看看代码

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);binding.setUser(new User("Jack", 10));}
}


用 DatabindingUtil.setContentView() 替换之前的 setContentView(),返回值是自动生成的 ActivityMainBinding,然后调用 setUser 方法把 User 实例绑定到 XML 文件中去。

这样,运行之后就可以看到 User 的信息被显示到了画面上了。

生成的 Binding 类的获取方式
上面例子中由于是 Activity 的 Layout 文件,所以使用了 DataBindingUtil.setContentView 来获取。

除了上面的方法,还可以通过 inflate 获取。

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


如果是在 ListView 或者 RecyclerView 的 adapter 中

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);


控制自动生成类的生成方式
默认情况下,会根据 XML 文件的名称(具体规则上文已经提及)在 .databinding 目录下生成文件。比如 package 名为 com.example.myapplication,那么会在 com.example.myapplication.databinding 下面生成文件。

生成的文件的名称也可以自定义。

<data class="MainBinding">...
</data>


这样的话,就会在 com.example.myapplication.databinding 下面生成 MainBinding 的文件。

生成的文件的路径也可以自定义。 
如果想直接在 package 下面生成

<data class=".MainBinding">...
</data>


加一个 . 就会在 com.example.myapplication 下面生成 MainBinding 的文件。

当然,不想使用 package 名,想自己自定义路径,也是可以的,写全你想要的路径即可

<data class="com.example.MainBinding">...
</data>


import
当在 XML 中数据绑定的时候,用到了 java.lang 之外的类,必须在 data 标签下面 import。 
比如想控制 View 的显示和隐藏。

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}"android:visibility="@{user.showName ? View.VISIBLE : View.GONE}" />


由于用到了 View 类,所以必须 import。

<data><import type="android.view.View" />......
</data>


variable 中用到的类也可以先 import 在使用,其实和 Java 是一样的。

<data><import type="com.example.tianjf.myapplication.User" /><variablename="user"type="User" />
</data>


如果类名相同,package 名不相同,上面的写法就会出现 type 不知道指定哪个类。但是别担心,可以用别名解决。

<data><import type="com.example.tianjf.myapplication.User" alias="User1" /><import type="com.example.tianjf.User" alias="User2" /><variablename="user1"type="User1" /><variablename="user2"type="User2" />
</data>


import 的类型可以用到 variable 中

    <data><import type="com.example.tianjf.myapplication.User" /><import type="java.util.List"/><variable name="user" type="User"/><variable name="userList" type="List<User>"/></data>


import 的类型可以用到表达式中

<TextViewandroid:text="@{((User)(user.connection)).lastName}"android:layout_width="wrap_content"android:layout_height="wrap_content"/>


import 的类型可以调用它的 static 变量和 static 方法

<data><import type="com.example.MyStringUtils"/><variable name="user" type="com.example.User"/>
</data>
…
<TextViewandroid:text="@{MyStringUtils.capitalize(user.lastName)}"android:layout_width="wrap_content"android:layout_height="wrap_content"/>


include
当 layout 文件中用到 include 的时候,variable 也可以传到 include 的 layout 文件中继续使用

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://schemas.android.com/apk/res-auto"><data><variable name="user" type="com.example.User"/></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><include layout="@layout/name"bind:user="@{user}"/><include layout="@layout/contact"bind:user="@{user}"/></LinearLayout>
</layout>


Null Safe
DataBinding 是 Null Safe 的,比如下列代码

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}"


如果 user 为 null,@{user.name} 也将为 null,并不会出现 NullPointerException。

表达式的使用
DataBinding 的时候可以指定绑定传进来的值,也可以使用表达式达到各种效果!

前面提到的控制 View 的显示和隐藏

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}"android:visibility="@{user.showName ? View.VISIBLE : View.GONE}" />


?? 操作符

android:text="@{user.displayName ?? user.lastName}"


如果不为 null,则选取 ?? 左边的,如果为 null,则选取 ?? 右边的,相当于以下代码

android:text="@{user.displayName != null ? user.displayName : user.lastName}"


集合的使用

<data><import type="android.util.SparseArray"/><import type="java.util.Map"/><import type="java.util.List"/><variable name="list" type="List<String>"/><variable name="sparse" type="SparseArray<String>"/><variable name="map" type="Map<String, String>"/>
</data>
…
android:text="@{list[0]}"
…
android:text="@{sparse[0]}"
…
android:text="@{map['key']}"


Resources 的使用

DataBinding 的时候也可以使用 resources

android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"


Format strings 也可以使用。 
比如下面的 string

<string name="name">My name is %s</string>


可以使用 String.format 传入参数

android:text="@{String.format(@string/name,user.name)}"


也可以这样写

android:text="@{@string/name(user.name)}"


双向绑定
前面介绍的都是单向绑定,即 ViewModel 的值绑定到 UI 上。如果希望 UI 的变更也反应到 ViewModel,那么就需要双向绑定了。其实双向绑定很简单,只需要加个 = 就好了。

<EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@={viewModel.firstName}"/>

 

这篇关于Databinding (一) 基本用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754901

相关文章

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

关于@RequestParam的主要用法详解

《关于@RequestParam的主要用法详解》:本文主要介绍关于@RequestParam的主要用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 基本用法2. 默认值3. 可选参数4. 绑定到对象5. 绑定到集合或数组6. 绑定到 Map7. 处理复杂类

SQL中的CASE WHEN用法小结

《SQL中的CASEWHEN用法小结》文章详细介绍了SQL中的CASEWHEN函数及其用法,包括简单CASEWHEN和CASEWHEN条件表达式两种形式,并通过多个实际场景展示了如何使用CASEWH... 目录一、简单CASE WHEN函数:二、CASE WHEN条件表达式函数三、常用场景场景1:不同状态展

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景