美文网首页Jetpack
Android DataBinding (二) 事件处理

Android DataBinding (二) 事件处理

作者: teletian | 来源:发表于2017-07-15 23:25 被阅读190次

    Android DataBinding (一) 基本用法
    Android DataBinding (二) 事件处理 (本文)
    Android DataBinding (三) Observable
    Android DataBinding (四) 自定义属性
    Android DataBinding (五) 自定义 View 的双向绑定
    Android DataBinding (六) EditText 绑定 TextChangedListener 和 FocusChangeListener

    DataBinding 的事件处理有两种方法

    1. 方法引用
    2. Listener 绑定

    方法引用

    通常会定义一个 Handler 或者 Presenter 类,并定义一个和 Listener 的方法签名一样的方法,然后再 xml 中调用。

    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 的参数还是调用方法的参数,都不需要遵循原 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)}" />
    

    如果用到了三目条件表达式 (?:),但是事件处理只有一个的情况下,另一个事件处理可以用 void 来¥代替

    android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"
    

    相关文章

      网友评论

        本文标题:Android DataBinding (二) 事件处理

        本文链接:https://www.haomeiwen.com/subject/gjarcxtx.html