Data Binding 系列(六)繫結介面卡

2021-09-24 07:08:39 字數 4517 閱讀 1327

繫結介面卡的作用就是,呼叫ui框架層合適的方法,給view屬性進行賦值。

比如,呼叫settext()方法給textviewtext屬性賦值;呼叫setonclicklistener()方法,給viewonclick屬性賦值。

繫結介面卡,可以讓你決定給view屬性賦值呼叫哪個方法,還可以讓你自己定製該方法的具體邏輯。

view屬性賦值

當資料發生變化時,繫結類必須呼叫view的合適的set()方法,給view屬性賦值。這時候有三種選擇:一種是讓data binding庫自己決定呼叫哪個方法;一種是明確指定呼叫哪個方法;一種是自己定義乙個方法。

比如view有乙個屬性叫做exampledata binding庫會試圖去找乙個setexample(args)的方法,這個方法接收的引數型別需要和繫結表示式的返回型別一致。注意,屬性命名空間是不考慮的,尋找方法的唯一標準就是,方法名和引數型別。

比如,對於表示式android:text="@"data binding庫會尋找該viewsettext(args)方法,如果user.name的型別是string,則尋找settext(string args)方法;如果user.name的型別是int,則尋找settext(int args)方法。

有時候view的屬性名和set()方法名並不匹配。比如imageview有乙個android:tint屬性,對應的方法名卻是setimagetintlist(colorstatelist),這時我們可以使用bindingmethods註解,bindingmethods用於註解乙個類,它可以包含多個bindingmethod註解,bindingmethod註解就宣告了view屬性要匹配哪個set()方法:

@bindingmethods(value = [

bindingmethod(

type = android.widget.imageview::class,

attribute = "android:tint",

method = "setimagetintlist")])

複製**

上面示例表明了:imageviewandroid:tint屬性,需要呼叫setimagetintlist()方法。

有時候view屬性需要自定義繫結邏輯。比如view屬性有android:paddingleft屬性卻沒有setpaddingleft(int)方法,但是有setpadding(int left, int top, int right, int bottom)方法,這時候我們需要自定義邏輯。這時,我們使用bindingadapter註解乙個static方法,如下所示:

@bindingadapter("android:paddingleft")

fun setpaddingleft(view: view, padding: int)

複製**

上面的示例表明了:viewandroid:paddingleft的屬性,會呼叫viewsetpadding(int left, int top, int right, int bottom)

注意,該方法的引數很重要,第乙個引數指明了view的型別,第二個引數指明了繫結表示式的返回值是int型別。

如果自定義的介面卡和系統的介面卡有衝突,自定義的介面卡會覆蓋系統的。

bindingadapter註解可以接收多個引數,如下所示:

@bindingadapter("imageurl", "error")

fun loadimage(view: imageview, url: string, error: drawable)

複製**

上述示例表明了:view型別是imageview,有兩個屬性imageurlerror,這兩個屬性對應繫結表示式的返回型別分別是stringdrawable

注意,只有當imageview同時有imageurlerror兩個屬性時,上述方法才會被呼叫。如果你希望imageview有任一屬性都可以呼叫,可以宣告requireall = false

@bindingadapter(value = ["imageurl", "placeholder"], requireall = false)

fun setimageurl(imageview: imageview, url: string, placeholder: drawable) else

}複製**

有時bindingadapter可能需要屬性的舊值,可以這麼使用:

@bindingadapter("android:paddingleft")

fun setpaddingleft(view: view, oldpadding: int, newpadding: int)

}複製**

@bindingadapter("android:onlayoutchange")

fun setonlayoutchangelistener(

view: view,

oldvalue: view.onlayoutchangelistener?,

newvalue: view.onlayoutchangelistener?

) if (newvalue != null)

}}複製**

上述示例中,第二個引數是舊值,第三個引數是新值。

資料型別轉換

在繫結表示式中,表示式的返回值型別需要與對應的set()方法接收的引數型別一致,如果不一致我們需要在繫結表示式中進行轉換,例如android:text=@user.age返回值型別是intsettext(string text)接收的引數型別是string,此時我們就需要進行轉換:

android:text=@

複製**

上述示例中:呼叫了string.valueof()方法,把int轉換為了string

有些場景是固定地在兩種型別之間進行轉換,這時候可以使用自定義轉換。比如viewandroid:background屬性接收drawable型別的資料,但是在繫結表示式中使用的卻是int型別,如下所示:

複製**
這時候,int需要轉換為drawable,我們可以使用bindingconversion註解乙個靜態方法,如下所示:

@bindingconversion

fun convertcolortodrawable(color: int) = colordrawable(color)

複製**

注意,繫結表示式中的返回值型別必須是固定的,如下所示是錯誤的:

複製**
上面示例中,繫結表示式的返回值型別是不確定的,可能是drawable或者int,這種使用方法是不行的。

Mondrian入門系列(六)

讀取schema檔案資訊 需要先建立連線 建立連線時選定乙個schema檔案 cube cube conn.getolapschema getcubes get i cube.getdimensions 獲取乙個namedlist cube.getmeasures 獲取乙個list dimensio...

python爬蟲系列(六)

由於時間安排本週只更新一篇 前面我們已經可以讀取 的源 了現在為了方便管理我們往往需要將其儲存。當然這裡就不得不說到資料庫這個東東比如mysql,當然鑑於目前只是基礎教程,我們不講太複雜的東西。這裡我們可以使用urllib.request.urlretrieve python open 方法用於開啟...

計畫測試系列 六 事

測試是做什麼事的呢?測試是為了 趕緊打住,我指的 事 是乙個測試專案過程中所做的具體的事,不是拿著 軟體測試 制定測試計畫 至於計畫的作用就不再贅述了,而測試計畫作為計畫測試活動的結晶,理應受到重視。在實際專案中我發現自己寫出來的測試計畫這個文件本身意義並不大,至少沒有計畫測試的過程那般有意義。在很...