繫結介面卡的作用就是,呼叫ui
框架層合適的方法,給view
屬性進行賦值。
比如,呼叫settext()
方法給textview
的text
屬性賦值;呼叫setonclicklistener()
方法,給view
的onclick
屬性賦值。
繫結介面卡,可以讓你決定給view
屬性賦值呼叫哪個方法,還可以讓你自己定製該方法的具體邏輯。
給view
屬性賦值
當資料發生變化時,繫結類必須呼叫view
的合適的set()
方法,給view
屬性賦值。這時候有三種選擇:一種是讓data binding
庫自己決定呼叫哪個方法;一種是明確指定呼叫哪個方法;一種是自己定義乙個方法。
比如view
有乙個屬性叫做example
,data binding
庫會試圖去找乙個setexample(args)
的方法,這個方法接收的引數型別需要和繫結表示式的返回型別一致。注意,屬性命名空間是不考慮的,尋找方法的唯一標準就是,方法名和引數型別。
比如,對於表示式android:text="@"
,data binding
庫會尋找該view
的settext(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")])
複製**
imageview
的android: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)
複製**
上面的示例表明了:view
的android:paddingleft
的屬性,會呼叫view
的setpadding(int left, int top, int right, int bottom)
。
注意,該方法的引數很重要,第乙個引數指明了view
的型別,第二個引數指明了繫結表示式的返回值是int
型別。
如果自定義的介面卡和系統的介面卡有衝突,自定義的介面卡會覆蓋系統的。
bindingadapter
註解可以接收多個引數,如下所示:
@bindingadapter("imageurl", "error")
fun loadimage(view: imageview, url: string, error: drawable)
複製**
上述示例表明了:view
型別是imageview
,有兩個屬性imageurl
和error
,這兩個屬性對應繫結表示式的返回型別分別是string
和drawable
。
注意,只有當imageview
同時有imageurl
和error
兩個屬性時,上述方法才會被呼叫。如果你希望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
返回值型別是int
,settext(string text)
接收的引數型別是string
,此時我們就需要進行轉換:
android:text=@
複製**
上述示例中:呼叫了string.valueof()
方法,把int
轉換為了string
。
有些場景是固定地在兩種型別之間進行轉換,這時候可以使用自定義轉換。比如view
的android: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 方法用於開啟...
計畫測試系列 六 事
測試是做什麼事的呢?測試是為了 趕緊打住,我指的 事 是乙個測試專案過程中所做的具體的事,不是拿著 軟體測試 制定測試計畫 至於計畫的作用就不再贅述了,而測試計畫作為計畫測試活動的結晶,理應受到重視。在實際專案中我發現自己寫出來的測試計畫這個文件本身意義並不大,至少沒有計畫測試的過程那般有意義。在很...