前言
之前的文章中我們了解了DataBinding的基礎(chǔ)用法和數(shù)據(jù)綁定,這一章我們來了解一下DataBinding中的運(yùn)算符,以便我們在實戰(zhàn)中能熟練的運(yùn)用這些運(yùn)算符方便我們的開發(fā)。
參考代碼地址:https://github.com/guoergongzi/GMVVMDemo/tree/main
參考代碼Module:gdatabindingdemo3
1、算術(shù)運(yùn)算符
說到運(yùn)算,四則運(yùn)算一定是我們首先想到的。加法運(yùn)算+、減法運(yùn)算-、懲罰運(yùn)算*、除法運(yùn)算/、求余運(yùn)算%五種運(yùn)算,我們只以加法運(yùn)算做一個示范。首先我們準(zhǔn)備在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);
運(yùn)行代碼,發(fā)現(xiàn)顯示在界面上的正是123+234的結(jié)果357,這就是DataBinding中四則運(yùn)算的寫法。
2、字符串合并
眾所周知,java中字符串合并操作也是通過操作符+來實現(xiàn)的,那么在DataBinding中是不是也是這樣呢?我們在activity_main中準(zhǔn)備兩個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");
運(yùn)行后TextView顯示aaabbb,說明我們的猜測是正確的,DataBinding中也可以用+符號來實現(xiàn)字符串合并操作。
3、邏輯運(yùn)算符
在開發(fā)中,我們應(yīng)該對邏輯運(yùn)算符&&和||不陌生,但是我們把它用在DataBinding時要注意一個細(xì)節(jié),DataBinding的表達(dá)式中不支持直接使用&和|這兩個字符,因此我們對這兩個字符進(jìn)行一下轉(zhuǎn)義。首先我們準(zhǔn)備一下xml文件內(nèi)容:
<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中這里應(yīng)該是變紅的,這時候mac按下option+entry鍵可以將這兩個&快捷轉(zhuǎn)義,這樣這句語句變成下面這樣:
android:text="@{String.valueOf(boolean1 && boolean2)}"
然后我們再給boolean1和boolean2賦值:
mainBinding.setBoolean1(true);
mainBinding.setBoolean2(false);
可以看到TextView上顯示了false,說明邏輯運(yùn)算符在DataBinding中是可以使用的。
4、一元運(yùn)算符
常見的一元運(yùn)算符有正號+、負(fù)號-、非!、位非~等,這里我們用非來做一個演示:
<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就應(yīng)該是true,而我們運(yùn)行起來后看到的也是true,這就是我們DataBinding中一元運(yùn)算符的使用方式。
5、二元運(yùn)算符
我們常用的二元運(yùn)算符:與&、或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分別賦值了不同的值,所以這個表達(dá)式的結(jié)果應(yīng)該是true,我們運(yùn)行起來發(fā)現(xiàn)顯示的結(jié)果和預(yù)期一致。
6、三元運(yùn)算符
在實際開發(fā)中,三元運(yùn)算符也是我們常常要用到的,這里我們用已有的boolean2、str1、str2來測試一下這個運(yùn)算符:
<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的內(nèi)容應(yīng)該顯示str2的值,我們運(yùn)行起來發(fā)現(xiàn)顯示了“bbb”,正是我們給str2賦的值。
7、移位運(yùn)算符
左移運(yùn)算符<<、右移運(yùn)算符>>、無符號右移運(yùn)算符>>>在我們的開發(fā)中并不常用,不熟悉的朋友們可以先搜索一下相關(guān)介紹,這里我們用一個簡單的例子來看看這些運(yùn)算符在DataBinding中的運(yùn)用,我們知道3<<2結(jié)果是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表達(dá)式中也是不能直接用的,我們點擊option+entry鍵并把兩個<轉(zhuǎn)義得到下面的語句:
android:text="@{String.valueOf(3 << 2)}"
這樣我們運(yùn)行起來,發(fā)現(xiàn)和預(yù)期一樣顯示了12。
8、比較運(yùn)算符
比較運(yùn)算符> < = >= <= ==不用多介紹了吧?我們直接用>來演示一下:
<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數(shù)值為123,num2數(shù)值為234,顯然num1 > num2是不成立的,運(yùn)行起來后如預(yù)期一樣顯示了false。
9、空合并運(yùn)算符
這個運(yùn)算符是DataBinding特有的寫法,參數(shù)1 ?? 參數(shù)2 ?? 參數(shù)3 。。。這樣的寫法DataBinding自動從前往后選取第一個非空參數(shù)使用,下面我們再聲明三個字符串來測試這個運(yùn)算符:
<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");
運(yùn)行起來后發(fā)現(xiàn)TextView上顯示了str5的內(nèi)容“ccc”。
下章預(yù)告
這一章里我們了解并測試了DataBinding中的運(yùn)算符,有關(guān)DataBinding的內(nèi)容剩下的已經(jīng)不多了。DataBinding是Android MVVM相關(guān)的四大組件中最復(fù)雜的一個,因此學(xué)習(xí)這部分內(nèi)容花費(fèi)了我們相當(dāng)大的篇幅,但是我相信全面的了解這一組件對我們使用MVVM高效開發(fā)很有幫助。下一章是我們DataBinding詳解的最后一章,我們會學(xué)習(xí)DataBinding剩下的知識和技巧,如自定義屬性和Lambda表達(dá)式等。
參考文檔:
CSDN:Android DataBinding 運(yùn)算符、BindingAdapter、 BindingConversion --xiaow
CSDN:Android 安卓DataBinding(九)·運(yùn)算符 --第三女神程憶難