2016-09-07 23 views
1

我想android數據綁定,我真的很驚訝它的功能。它確實將視圖的所有getter和setter轉移到一個位置(佈局文件或自定義綁定適配器)。綁定適配器中的命名空間?

但是,我不明白的是這裏使用的命名空間?我正在讀喬治最近的一篇文章對中here,他提到:

任何應用程序命名空間並不需要在參數的任何命名空間,但在Android名稱空間的屬性,你必須給完整的屬性名稱包括「android」。

所以,如果我不給名稱空間,它的作品。我的自定義屬性名稱間隔爲xmlns:app="http://schemas.android.com/apk/res-auto"。我真的不知道這意味着什麼。

說我有一個文本視圖,我很喜歡這個(只是舉例硬編碼字符串)這樣做:

<TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text='@{"Created By:" + user.name + " on " + user.time}' /> 

這是真的好,我可以在這裏提供的參數:

<TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:createdBy="@{user.name}" 
     app:createdAt="@{user.time}" /> 

而且通過將該文本設置爲與上述示例相同來處理Java中的代碼。這爲佈局文件提供了易於使用和易於理解的代碼。

但是,這種爭論有時會發生衝突。如果我在2個不同格式的地方使用這兩種不同的格式,如Created by User A on 7/10/2016From User A (7/10/2016)。這兩者都可能需要與我在第二個示例中展示的相同的參數。我怎樣才能區分它們?

我還可以提供第三個參數一樣app:format並讓自己的自定義綁定功能,可以理解,但能在這裏命名空間中的重要作用?我可以爲多個數據綁定元素提供自定義名稱空間,並在綁定適配器中相應地處理它們嗎?或者喬治在他的文章中提到的命名空間會被忽略?

在官方文檔他們已經使用bind:命名空間和結合銜接方法,他們也提供了命名空間。我對命名空間在數據綁定中的角色有點困惑。

回答

2

XML是非常靈活的,允許您提供任意數量的命名空間。然而,Android還不夠靈活,無法處理兩個以上 - android和您的應用程序的名稱空間。 Android數據綁定不區分任何應用程序名稱空間名稱。例如bind:app:並不重要,因爲它們都是指http://schemas.android.com/apk/res-auto

所以,回答你的問題是「否」。命名空間不會真的有所幫助。你可能使用android命名空間 - 假設沒有不幸的衝突。這隻能將你的靈活性從一個擴展到兩個,我敢肯定你想要比這更好的東西。

這個具體的例子是完美的字符串格式化表達式:

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text='@{@string/createdBy(user.name, user.time)}' /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text='@{@string/fromUser(user.name, user.time)}' /> 

但一般來說,你必須要麼使用不同的用途,不同的屬性名稱或添加屬性的微分如你所說。

+0

嗨,喬治!它真的很高興收到你的來信。我已經這樣做了,但那個''時間'東西很長,所以轉換它需要一個'BindingAdapter'。通過提供自定義屬性,它確實擴展了佈局文件的功能。我想知道什麼是放置BindingAdapter方法的最佳位置?在一個幫手類裏面?如果您有多個輔助類或活動類,其佈局文件將顯示在屏幕上?期待您的下一篇關於Medium的數據綁定的文章。 – kirtan403

+0

你也可以在你的表達式中使用方法,雖然它可能會讓你的表達有點難以實現:'@ {@ string/createdBy(user.name,TimeUtil.toDate(user.time))}''。如果你有自定義視圖的BindingAdapter,我會把它們放在它們自己的類中。然而,這是不同的。有很多方法可以組合,我不能說一個是對的,一個是錯的。如果相同屬性的屬於同一個類,找到正確的BindingAdapter可能會更容易。 –

+0

謝謝你的建議。把常用的多個地方放在一個輔助方法中進行數據綁定,特別是在單個活動中可以放入活動類中。我會去的! – kirtan403