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