Android端MVVM从入门到实战(第四篇) - DataBinding运算符

前言

之前的文章中我们了解了DataBinding的基础用法和数据绑定,这一章我们来了解一下DataBinding中的运算符,以便我们在实战中能熟练的运用这些运算符方便我们的开发。

参考代码地址:https://github.com/guoergongzi/GMVVMDemo/tree/main

参考代码Module:gdatabindingdemo3

1、算术运算符

说到运算,四则运算一定是我们首先想到的。加法运算+、减法运算-、惩罚运算*、除法运算/、求余运算%五种运算,我们只以加法运算做一个示范。首先我们准备在activity_main中声明并使用两个int类型的变量:

<variable
    name="num1"
    type="Integer" />

<variable
    name="num2"
    type="Integer" />

。。。

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{String.valueOf(num1 + num2),default = 100}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

然后我们在MainActivity中给这两个变量赋值:

mainBinding.setNum1(123);
mainBinding.setNum2(234);

运行代码,发现显示在界面上的正是123+234的结果357,这就是DataBinding中四则运算的写法。

2、字符串合并

众所周知,java中字符串合并操作也是通过操作符+来实现的,那么在DataBinding中是不是也是这样呢?我们在activity_main中准备两个String类型的变量并试试这个操作:

<variable
    name="str1"
    type="String" />

<variable
    name="str2"
    type="String" />

。。。

<TextView
    android:id="@+id/tv_2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{str1 + str2,default = 测试字符串}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_1" />

再分别给str1和str2赋值:

mainBinding.setStr1("aaa");
mainBinding.setStr2("bbb");

运行后TextView显示aaabbb,说明我们的猜测是正确的,DataBinding中也可以用+符号来实现字符串合并操作。

3、逻辑运算符

在开发中,我们应该对逻辑运算符&&和||不陌生,但是我们把它用在DataBinding时要注意一个细节,DataBinding的表达式中不支持直接使用&和|这两个字符,因此我们对这两个字符进行一下转义。首先我们准备一下xml文件内容:

<variable
    name="boolean1"
    type="Boolean" />

<variable
    name="boolean2"
    type="Boolean" />

。。。

<TextView
    android:id="@+id/tv_3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{String.valueOf(boolean1 && boolean2)}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_2" />

这里我们可以看到我们直接使用了&&,在Android Studio中这里应该是变红的,这时候mac按下option+entry键可以将这两个&快捷转义,这样这句语句变成下面这样:

android:text="@{String.valueOf(boolean1 &amp;&amp; boolean2)}"

然后我们再给boolean1和boolean2赋值:

mainBinding.setBoolean1(true);
mainBinding.setBoolean2(false);

可以看到TextView上显示了false,说明逻辑运算符在DataBinding中是可以使用的。

4、一元运算符

常见的一元运算符有正号+、负号-、非!、位非~等,这里我们用非来做一个演示:

<TextView
    android:id="@+id/tv_4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{String.valueOf(!boolean2)}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_3" />

这里我们直接用之前声明的boolean2做个演示,boolean2的值是false,!boolean2就应该是true,而我们运行起来后看到的也是true,这就是我们DataBinding中一元运算符的使用方式。

5、二元运算符

我们常用的二元运算符:与&、或I、异或在DataBinding中也都是可用的,这里我们用异或来举个例子,还是用之前声明的boolean1和boolean2来试试:

<TextView
    android:id="@+id/tv_5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{String.valueOf(boolean1 ^ boolean2)}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_4" />

由于我们给boolean1和boolean2分别赋值了不同的值,所以这个表达式的结果应该是true,我们运行起来发现显示的结果和预期一致。

6、三元运算符

在实际开发中,三元运算符也是我们常常要用到的,这里我们用已有的boolean2、str1、str2来测试一下这个运算符:

<TextView
    android:id="@+id/tv_6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{boolean2?str1:str2}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_5" />

这里我们的boolean2为false,所以TextView的内容应该显示str2的值,我们运行起来发现显示了“bbb”,正是我们给str2赋的值。

7、移位运算符

左移运算符<<、右移运算符>>、无符号右移运算符>>>在我们的开发中并不常用,不熟悉的朋友们可以先搜索一下相关介绍,这里我们用一个简单的例子来看看这些运算符在DataBinding中的运用,我们知道3<<2结果是12,这里我们用一个TextView来显示一下:

<TextView
    android:id="@+id/tv_7"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{String.valueOf(3 << 2)}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_6" />

和&一样,<符号在DataBinding表达式中也是不能直接用的,我们点击option+entry键并把两个<转义得到下面的语句:

android:text="@{String.valueOf(3 &lt;&lt; 2)}"

这样我们运行起来,发现和预期一样显示了12。

8、比较运算符

比较运算符> < = >= <= ==不用多介绍了吧?我们直接用>来演示一下:

<TextView
    android:id="@+id/tv_8"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{String.valueOf(num1 > num2)}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_7" />

这里我们的num1数值为123,num2数值为234,显然num1 > num2是不成立的,运行起来后如预期一样显示了false。

9、空合并运算符

这个运算符是DataBinding特有的写法,参数1 ?? 参数2 ?? 参数3 。。。这样的写法DataBinding自动从前往后选取第一个非空参数使用,下面我们再声明三个字符串来测试这个运算符:

<variable
    name="str3"
    type="String" />

<variable
    name="str4"
    type="String" />

<variable
    name="str5"
    type="String" />

。。。

<TextView
    android:id="@+id/tv_9"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{str3 ?? str4 ?? str5}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_8" />

然后我们跳过str3、str4直接给str5赋值:

mainBinding.setStr5("ccc");

运行起来后发现TextView上显示了str5的内容“ccc”。

下章预告

这一章里我们了解并测试了DataBinding中的运算符,有关DataBinding的内容剩下的已经不多了。DataBinding是Android MVVM相关的四大组件中最复杂的一个,因此学习这部分内容花费了我们相当大的篇幅,但是我相信全面的了解这一组件对我们使用MVVM高效开发很有帮助。下一章是我们DataBinding详解的最后一章,我们会学习DataBinding剩下的知识和技巧,如自定义属性和Lambda表达式等。

参考文档:

CSDN:Android DataBinding 运算符、BindingAdapter、 BindingConversion --xiaow

CSDN:Android 安卓DataBinding(九)·运算符 --第三女神程忆难

CSDN:Android DataBinding的基本使用 -- 尹中文

CSDN:Android DataBinding 从入门到进阶,看这一篇就够 -- 程序员一东

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容