美文网首页
Databinding 使用二

Databinding 使用二

作者: 走在冷风中吧 | 来源:发表于2018-02-12 18:02 被阅读7次

    上一篇中我们介绍了 databinding 的简单使用, 简单绑定view, 以及加载显示静态的数据, 但是实际在使用的过程中, 我们可能需要动态的改变一些 view 的值, databinding 帮我们很轻松的实现了这个功能~~


    我们需要改变的就是实体 bean 类, 让实体类继承BaseObservable,

    public class TestBean extends BaseObservable {
    
        public final ObservableField<String> userName = new ObservableField<>();
        Boolean showFlag = true;
    
        @Bindable
        public Boolean getShowFlag() {
            return showFlag;
        }
    
        public void setShowFlag(Boolean showFlag) {
            this.showFlag = showFlag;
            notifyPropertyChanged(BR.showFlag);
        }
    }
    

    以上bean类中使用了两种动态绑定方法

    1. 使用@bindable注解, 在属性的 get 方法上进行注解, 编译之后, 会在BR文件中生成对应的变量 id, 如上为 BR.showFlag, 当我们绑定的 testBean 对象中的 showFlag 产生变化时, 布局显示会自动根据绑定的实际值去刷新 view, 相当智能, 省去了很多 activity中无用的成员变量, 以及后期的找 view 设置值.
    2. 使用 ObservableField<>定义属性, 这样写相当于不需要再写 getset 的两个对应方法, 同样可以达到动态绑定数据的效果.

    在 bean 中进行动态属性的绑定后, 我们在 xml 中可以自由自在的使用需要的属性了~

    关于xml中引用表达式

    xml 支持大多数的 java 表达式:

    android:text="@{String.valueOf(age)}"
    android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
    android:text='@{"iname:" +user.name}'
    

    除了户外还支持 null 合并操作, 就很牛逼了~

    android:text="@{user.displayName ?? user.lastName}"
    //等价于
    android:text="@{user.displayName != null ? user.displayName : user.lastName}"
    

    相比较 java 代码不支持的是:
    • this
    • super
    • new
    • 显式泛型调用 <T>


    在 xml布局中, 在设置一些值或者变量的时候, 可能需要使用转义字符,否则没有办法编译通过, 常见的转义字符包括:

    显示结果 描述 转义字符 十进制
    空格 &nbsp; &#160;
    < 小于号 &lt; &#60;
    > 大于号 &gt; &#62;
    & 与号 &amp; &#38;
    " 引号 &quot; &#34;
    撇号 &apos; &#39;
    × 乘号 &times; &#215;
    ÷ 除号 &divide; &#247;

    事件处理

    我们经常需要处理一些 view 的点击事件, 通常我们的方法是setOnClickListener(), 或者通过ButterNife第三方绑定点击事件, 引入 dataBinding 后, 有两种方法去设置点击事件:

    1. 通过activity绑定到 onclick 事件
        <data>
    
            <variable
                name="activity"
                type="com.example.databinding.MainActivity" />
    
        </data>
    
                <TextView
                    android:id="@+id/tv_dis"
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:layout_gravity="center"
                    android:background="@color/colorAccent"
                    android:gravity="center"
                    android:onClick="@{v -> activity.onClick(v)}"
                    android:text="点击隐藏/显示include" />
    

    相关文章

      网友评论

          本文标题:Databinding 使用二

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