美文网首页
Data Binding事件绑定

Data Binding事件绑定

作者: 努力生活的西鱼 | 来源:发表于2019-03-06 13:28 被阅读0次

    Data Binding

    1. 构建环境

    在moudle的gradle里面,添加下面代码

    dataBinding {
        enabled = true
    }
    
    2. Data Binding Layout文件

    Data Binding layout文件有点不同的是:起始根标签是layout,接下来一个data元素以及一个view的根元素。这个View元素就是你没有使用Data Binding的layout文件的根元素。

    <?xml version="1.0" encoding="utf-8"?>
    <layout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <data>
            <variable
                name='user'
                type='com.skyrayinstrument.wumeng.app_mvvm.User'/>
        </data>
    
        <!--原先的根节点 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"/>
    
        </LinearLayout>
    
    </layout>
    

    在data内部描述了一个名为user的变量属性,使其可以在这个layout中使用:

     <variable
                name='user'
                type='com.skyrayinstrument.wumeng.app_mvvm.User'/>
    

    在layout的属性表达式写作@{},下面是一个TextView的text设置为user的name属性:

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{user.name}"/>
    
    3. Data对象
    public class User {
    
        public String name;
    
    }
    

    从Data Binding的角度来看,TextView中的android:text属性的表达式@{user.name}将访问对象中的name。

    4. Binding数据

    默认情况下,一个Binding类会基于layout文件的名称而产生,将其转换为Pascal case(首字母大写的命名规范)并且添加"Binding"后缀,上述的layout文件是main_activity.xml,因此生成的类名是MainActivityBinding。此类包含从layout属性到layout的Views中所有的bindings(例如user变量),并且它还知道如何给Binding表达式分配数值。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
    
       // 没有通过ID找到控件,然后对控件进行操作,只是对field进行操作,就可以改变View的值
    
       ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
       User user = new User();
       user.name = "张三";
       binding.setUser(user);
    
    5. Observable字段
    new Thread(new Runnable() {
        @Override
        public void run() {
            SystemClock.sleep(5000);
            user.name="李四";
        }
    }).start();
    

    通过上面的代码,我们修改了user对象的值,但是在UI的显示上并没有起到作用。
    所以说,并没有起到双向绑定的目标。
    Data Binding的真正能力是当数据变化时,可以通知给你的Data对象。有三种不同的数据变化通知机制:Observable对象,ObservableFields以及Observable collections。

    当这些可观察Data对象绑定到UI,Data对象属性的更改后,UI也将自动更新。

    6. ObservableFields

    ObservableFields是自包含具有单个字段的Observable对象。它有所有基本类型和一个是引用类型。要使用它需要在data对象中创建public final字段。

    public class User {
    
        public final ObservableField<String> name = new ObservableField<>();
    
    }
    

    要访问该值,使用set和get方法

    ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
    final User user = new User();
    user.name.set("张三");
    binding.setUser(user);
    

    相关文章

      网友评论

          本文标题:Data Binding事件绑定

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