在上篇文章提到, 通過Android Studio, 你可以在layout文件里給變量賦值.下面的例子把展示用戶名的text的值設(shè)成如下表達(dá)式
android:text="@{user.firstName}"
用戶類被定義成傳統(tǒng)Java對象(POJO):
public class User {
public String firstName;
public String lastName;
public Bitmap image;
}
你的大多數(shù)類都不是用public域(我認(rèn)為), 而且為其提供訪問函數(shù).
但是,layout文件中的表達(dá)式應(yīng)該簡短而且易于閱讀, 所以我們不希望開發(fā)者不得不在表達(dá)式中添加類似getFirstName()或getLastName()這樣的函數(shù).表達(dá)式解析器會(huì)自動(dòng)嘗試為屬性去尋找Java Bean的訪問函數(shù)(getXxx()或isXxx()).當(dāng)你的類有訪問函數(shù)時(shí),使用上面的(即變量名)表達(dá)式也會(huì)工作.
public class User {
private String firstName;
private String lastName;
private Bitmap image;
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }
public Bitmap getImage() { return image; }
}
如果解析器找不到類似于getXxx()的函數(shù),那么它會(huì)尋找類似xxx()的函數(shù).所以你可以使用user.hasFriend來訪問函數(shù)hasFriend().
Android Data Binding表達(dá)式語法同樣支持類似Java的數(shù)組訪問:
android:text="@{user.friends[0].firstName}"
所以可以使用中括號(hào)作為get函數(shù)的簡寫.
Data Binding同樣支持幾乎所有的java語言表達(dá)式,包括函數(shù)調(diào)用,
三元操作符及數(shù)學(xué)操作. 但不要太瘋狂:
android:text='@{user.adult ? ((user.male ? "Mr. " : "Ms. ") + user.lastName) : (user.firstName instanceof String ? user.firstName : "kid") }'
上面的代碼沒人能讀懂!而且使用硬編碼字符串非常難維護(hù).
把復(fù)雜的表達(dá)式放到模塊中.
另外,Data Binding提供了"null-合并"操作符 ?? 來簡化三元操作符.
android:text=”@{user.firstName ?? user.userName}”
相當(dāng)于:
android:text=”@{user.firstName != null ? user.firstName : user.userName}”
binding表達(dá)式另一個(gè)更酷的事情就是可以使用資源:
android:padding=”@{@dim/textPadding + @dim/headerPadding}
這可以節(jié)省很多不必要的單獨(dú)值定義.你是不是經(jīng)常會(huì)只想添加或去除尺寸?目前還不支持style.
你同樣可以使用字符串,數(shù)量和精度格式, 只要符合資源方法getString,getQuantitiString和getFraction的語法即可.
直接想資源中傳遞參數(shù)即可.
android:text=”@{@string/nameFormat(user.firstName, user.lastName)}”
NullPointerException<a id="orgheadline7"></a>
Data Binding表達(dá)式一個(gè)很方便的地方就是執(zhí)行時(shí)總是會(huì)檢查null值.這意思著對于如下表達(dá)式:
android:text=”@{user.firstName ?? user.userName}”
如果user是null,那么user.firstName和user.userName也會(huì)被解析成null.不會(huì)觸發(fā)NullPointerException.
但這并不意味著就不會(huì)產(chǎn)生NullPointerException.例如下面的表達(dá)式:
android:text=”@{com.example.StringUtils.capitalize(user.firstName)}”
public static String capitalize(String str) {
return Character.toUpperCase(str.charAt(0)) + str.substring(1);
}
當(dāng)傳入的參數(shù)為null時(shí),必然會(huì)產(chǎn)生NullPointerException.
導(dǎo)入<a id="orgheadline8"></a>
在上面的例子中, 表達(dá)式很長. 我們想導(dǎo)入類型使得表達(dá)式變短.可以通過在data塊中導(dǎo)入:
<data>
<variable
name="user"
type="com.example.myapp.model.User"/>
<import
type="com.example.StringUtils"/>
</data>
表達(dá)式則簡化為:
android:text=”@{StringUtils.capitalize(user.firstName)}”