Android DataBinding (一) 基本用法
Android DataBinding (二) 事件處理 (本文)
Android DataBinding (三) Observable
Android DataBinding (四) 自定義屬性
Android DataBinding (五) 自定義 View 的雙向綁定
Android DataBinding (六) EditText 綁定 TextChangedListener 和 FocusChangeListener
DataBinding 的事件處理有兩種方法
- 方法引用
- Listener 綁定
方法引用
通常會定義一個 Handler 或者 Presenter 類走净,并定義一個和 Listener 的方法簽名一樣的方法奠伪,然后再 xml 中調(diào)用章咧。
public class MyHandlers {
public void onClick(View view) { ... }
}
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:onClick="@{handlers::onClick}"/>
Listener 綁定
Listener 綁定采用了 Lambda 的形式扣泊,和方法引用差不多钙皮,但是不管是 Lambda 的參數(shù)還是調(diào)用方法的參數(shù)赁遗,都不需要遵循原 Listener 的方法簽名。
public class Presenter {
public void onClick(Task task){}
}
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:onClick="@{() -> presenter.onClick(viewModel)}"/>
由于不受方法簽名的限制栅受,以下兩種寫法也是可以的
android:onClick="@{(view) -> presenter.onClick(viewModel)}"
public class Presenter {
public void onClick(View view, Task task){}
}
android:onClick="@{(view) -> presenter.onClick(view, viewModel)}"
再來一個 CheckBox 的例子
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onCheckedChanged="@{(cb, isChecked) ->
presenter.completeChanged(viewModel, isChecked)}" />
如果用到了三目條件表達(dá)式 (?:)将硝,但是事件處理只有一個的情況下,另一個事件處理可以用 void 來¥代替
android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"