前言
之前的文章中我们了解了DataBinding的基础用法和数据绑定,这一章我们来了解一下DataBinding中的运算符,以便我们在实战中能熟练的运用这些运算符方便我们的开发。
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 && 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 << 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表达式等。