android mvvm 官方例子,详解Android的MVVM框架 - 数据绑定

本教程是跟着 Data Binding Guide学习过程中得出的一些实践经验,同时修改了官方教程的一些错误,每一个知识点都有对应的源码,争取做到实践与理论相结合。

Data Binding 解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性。其实在此之前,已经有些第三方的框架可以支持 MVVM 模型,无耐由于框架的侵入性太强,导致一直没有流行起来。

准备

Android Studio 更新到 1.3 版本

打开 Preferences,找到 Appearances & Behavior 下的 Updates 选项,把 Automatically Check updates for 修改成 Canary Channel。

8c5fa1a3457f693e36f011f74f89931a.png

注意

Data Binding 是一个 support 包,因此与 Android M 没什么关系,可以不用下载 Android MNC Preview 的 SDK。

新建一个 Project

修改 Project 的 build.gradle,为 build script 添加一条依赖,Gradle 版本为 1.2.3。

classpath 'com.android.tools.build:gradle:1.2.3'

classpath 'com.android.databinding:dataBinder:1.0-rc0'

为用到 Data Binding 的模块添加插件,修改对应的 build.gradle。

apply plugin: 'com.android.databinding'

注意

如果 Module 用到的 buildToolsVersion 高于 22.0.1,比如 23 rc1,那 com.android.databinding:dataBinder 的版本要改为 1.3.0-beta1,否则会出现如下错误:

55a1c99970e0d3b171c7fbcbda931560.png

基础

工程创建完成后,我们通过一个最简单的例子来说明 Data Binding 的基本用法。

布局文件

使用 Data Binding 之后,xml的布局文件就不再单纯地展示 UI 元素,还需要定义 UI 元素用到的变量。所以,它的根节点不再是一个 ViewGroup,而是变成了 layout,并且新增了一个节点 data。

....

要实现 MVVM 的 ViewModel 就需要把数据与UI进行绑定,data 节点就为此提供了一个桥梁,我们先在 data 中声明一个 variable,这个变量会为 UI 元素提供数据(例如 TextView 的 android:text),然后在 Java 代码中把”后台”数据与这个 variable 进行绑定。

如果要用一个表格来展示用户的基本信息,用 Data Binding 应该怎么实现呢?

数据对象

添加一个 POJO 类 - User,非常简单,四个属性以及他们的 getter 和 setter。

public class User {

private final String firstName;

private final String lastName;

private String displayName;

private int age;

public User(String firstName, String lastName) {

this.firstName = firstName;

this.lastName = lastName;

}

public User(String firstName, String lastName, int age) {

this(firstName, lastName);

this.age = age;

}

public int getAge() {

return age;

}

public String getFirstName() {

return firstName;

}

public String getLastName() {

return lastName;

}

public String getDisplayName() {

return firstName + " " + lastName;

}

public boolean isAdult() {

return age >= 18;

}

}

稍后,我们会新建一个 User 类型的变量,然后把它跟布局文件中声明的变量进行绑定。

定义 Variable

再回到布局文件,在 data 节点中声明一个变量 user。

其中 type 属性就是我们在 Java 文件中定义的 User 类。

当然,data 节点也支持 import,所以上面的代码可以换一种形式来写。

然后我们刚才在 build.gradle 中添加的那个插件 - com.android.databinding会根据xml文件的名称 Generate 一个继承自 ViewDataBinding 的类。

例如,这里 xml 的文件名叫 activity_basic.xml,那么生成的类就是 ActivityBasicBinding。

注意

java.lang.* 包中的类会被自动导入,可以直接使用,例如要定义一个 String 类型的变量:

绑定 Variable

修改 BasicActivity 的 onCreate 方法,用 DatabindingUtil.setContentView() 来替换掉 setContentView(),然后创建一个 user 对象,通过 binding.setUser(user) 与 variable 进行绑定。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityBasicBinding binding = DataBindingUtil.setContentView(

this, R.layout.activity_basic);

User user = new User("fei", "Liang");

binding.setUser(user);

}

注意

ActivityBasicBinding 类是自动生成的,所有的 set 方法也是根据 variable 名称生成的。例如,我们定义了两个变量。

那么就会生成对应的两个 set 方法。

setFirstName(String firstName);

setLastName(String lastName);

使用 Variable

数据与 Variable 绑定之后,xml 的 UI 元素就可以直接使用了。

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@{user.lastName}" />

至此,一个简单的数据绑定就完成了,可参考完整代码

高级用法

使用类方法

首先为类添加一个静态方法

public class MyStringUtils {

public static String capitalize(final String word) {

if (word.length() > 1) {

return String.valueOf(word.charAt(0)).toUpperCase() + word.substring(1);

}

return word;

}

}

然后在 xml 的 data 节点中导入:

使用方法与 Java 语法一样:

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@{StringUtils.capitalize(user.firstName)}" />

类型别名

如果我们在 data 节点了导入了两个同名的类怎么办?

这样一来出现了两个 User 类,那 user 变量要用哪一个呢?不用担心,import 还有一个 alias 属性。

Null Coalescing 运算符

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

就等价于

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

属性值

通过 ${} 可以直接把 Java 中定义的属性值赋值给 xml 属性。

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

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

使用资源数据

这个例子,官方教程有错误,可以参考Android Data Binder 的一个bug,完整代码在此。

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

android:background="@android:color/black"

android:textColor="@android:color/white"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello_world" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2015 代码左缩进

TabShift转载于:https://www.cnblogs.com/527289276qq/p/8027882.html

mac设置文件权限_如何在Mac上设置文件权限

mac设置文件权限Like all major operating systems, macOS allows you to restrict access to files using a complex set of file permissions. You can set these yourself using the Finder app, or by using the chmod command in your Mac’s terminal. Here’s how. 与所…

Discrete Log Algorithms :Baby-step giant-step

离散对数的求解 1.暴力 2.Baby-step giant-step 3.Pollard’s ρ algorithm …… 下面搬运一下Baby-step giant-step 的做法 这是在 https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/discrete-log/discrete-log/ 上看到的,比较容易理解。 而且,…

Android添加item动画,RecyclerView基础篇-Item添加动画

Android_Banner.jpg简介本节中我们介绍下给RecyclerView中的Item添加动画。添加的动画,分为,在打开列表时有Item的展示动画,当滑动的时候没有动画和打开列表滑动时有动画两种实现过程实现一个列表效果如下Screenshot_2020-09-01-17-03-35-349…

Oracle数据库查询用 where in 查询的项超过1000条的解决方案

众所周知,如果我们的用SQL查询语句时,如果用where in带的参数超过1000条的话,oracle是会报错的。 因为项目中遇到这样的问题,所以找到了接下来我要说的这个办法。 因为用的地方很多,所以我把这个封装成了一个方法。 //…

geek_Ask How-To Geek:营救受感染的PC,安装无膨胀iTunes和驯服疯狂的触控板

geekYou’ve got questions and we’ve got answers. Today we highlight how to save your computer if it’s so overrun by viruses and malware you can’t work from within Windows, install iTunes without all the bloat, and tame a hyper-sensitive trackpad. 您有问…

第1课:接口测试和jmeter总结

接口测试 1. 接口的分类:webService和http api接口1) webService接口:是按照soap协议通过http传输,请求报文和返回报文都是xml格式,一般要借助工具来测试接口;2) http api接口:是按照…

android 工作日,如何在Android上重复警报工作日

小编典典请尝试此代码。已在我的应用中成功运行if (chk_monday.isChecked()) {forday(2);} else if (chk_tuesday.isChecked()) {forday(3);} else if (chk_wednesday.isChecked()) {forday(4);} else if (chk_thursday.isChecked()) {forday(5);} else if (chk_friday.isCheck…

hdu4419

对于这类面积覆盖的题,大致就两点要注意的 1.同一把矩形放在笛卡尔坐标系上做 2.pushup函数要注意下细节:及在统计子区间和之前要先判断是否有子区间 用sum数组来保存区间被覆盖的情况,如果遇到多次覆盖问题,那就开多个sum数组分别保存被覆盖…

最简单 - 单例模式

public class Person {// Person 引用private static Person p null;static {if (p null) {p new Person();}}/***单例模式获取Person对象. * return*/public static Person getInstance(){return p;} ​} 复制代码转载自: 简书 - 低至一折起 文章:w…

极客时间和极客学院_极客历史记录的本周:Twitter的诞生,OS X十周年以及太空停留时间最长的时代即将结束...

极客时间和极客学院Every week we bring you interesting trivia and milestones from the archives of Geekdom. Today we’re taking a peek at the birth of Twitter, ten years of Mac OS X, and the longest space stay in history. 每周,我们都会为您带来有趣…

Android风格ppt,Material Design风格的快手PPT

突发奇想,感觉MD风格既然适合 Android 软件的界面,那么在一般PPT 演示中,效果当也是不错。于是在网上去寻了几处制作贴,也简单看了 MD 设计指南的几处要点。先试试一番再说。关于 MD 设计指南和几处制作贴,我会把链接贴…

11月16日站立会议

今天是冲刺阶段的第二天,我今天做了统计在线人数模块的编写而且对其进行了测试并修改完成,为团队制作了今日的燃尽图。 明天我要完成服务器端可以断开所有用户连接的一个小模块和继续为团队制作燃尽图。 今天遇到的困难是用Java进行编写时,出…

iOS核心动画高级技术(十三) 高效绘图

More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason—including blind stupidity. 不必要的效率考虑往往是性能问题的万恶之源。 ——William Allan Wulf #软件绘图 术语绘图通常在Core Anima…

dropbox链接过期_询问操作方法:“开始”菜单中的Dropbox,了解符号链接和翻录TV系列DVD...

dropbox链接过期This week we take a look at how to incorporate Dropbox into your Windows Start Menu, understanding and using symbolic links, and how to rip your TV series DVDs right to unique and high-quality episode files. 本周,我们来看看如何将D…

android listpreference 自定义,Android – 我的ListPreference中的自定义行布局

在我的Android应用程序中,我实现了从ListPreference扩展的类SubtitleColorListPreference.我需要这个,因为我需要为列表中的每个项目设置自己的布局.一切正常,它看起来像这样:重要的代码是onPrepareDialogBu​​ilder(AlertDialog.Builder builder)中的方法,我在其中…

springMVC3学习(十一)--文件上传CommonsMultipartFile

版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/itmyhome/article/details/27976873 使用springMVC提供的CommonsMultipartFile类进行读取文件须要用到上传文件的两个jar包 commons-logging.jar、commons-io-xxx.jar1、在sp…

基于React和SpringBoot的快速开发模板QuickAdmin

经过一段时间的总结和完善,我的管理系统快速开发模板已经基本成型,现在GitHub上开源啦: QuickAdmin QuickAdmin是基于Spring Boot和React.js实现的管理系统开发框架。用于开发网站的后台管理系统。 本框架提供了如下功能: 完整的基…

android sim iso,android – 意外的telephonyManager.getSimCountryIso()行为

您可以使用MCC MNC获取SIM卡国家/地区,它是SIM配置的,与您所在的网络无关.Configuration config getResources().getConfiguration();int countryCode config.mcc;您可以在此处找到MCC列表MccTable.java例如,西班牙是214,法国是208MCC should work on all GSM devices with S…

火狐 增强查找工具栏_在“提示”框中:简单的IE至Firefox同步,轻松的Windows工具栏和识别USB电缆...

火狐 增强查找工具栏() Every week we tip into our mail bag and share great tips from your fellow readers. This week we’re looking at an easy way to sync your bookmarks between IE and Firefox, using simple Windows toolbars, and a clever way to ID USB cables…