美文网首页
Android-DataBinding入门系列(一)基本介绍

Android-DataBinding入门系列(一)基本介绍

作者: hacjy | 来源:发表于2017-12-06 08:55 被阅读0次

    Google在15年的发布大会上提出了DataBinding数据绑定框架,解决了Android编程的一大痛点。官方原生支持MVVM模型让我们可以在不改变既有的框架上使用上新的特性。它可以使我们的代码更加简洁,不必在页面中写太多的findViewById,省时省力。今天我们也体验了一把,记录下遇到的问题和简单的入门介绍下。


    image.png

    1、Android Studio需要更新到 1.3 版本,而且需要开启DataBinding功能:

    在build.gradle配置:

    android{
        dataBinding{
            enabled = true
        }
    }
    

    2、布局

    布局中,根节点要以layout开头,声明数据使用data标签。在data中可以为数据对象声明变量,引入要使用的类等。
    (1)在具体控件中使用对象的数据也挺简单的,使用@{对象变量.对象属性}就可以取出数据了;
    (2)支持绑定事件:@{对象.方法名(参数)}。
    代码如下:activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!-- DataBinding 现在根节点layout -->
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- 绑定的数据对象 -->
        <data>
            <!-- 为数据对象声明变量:user,取出属性的用法:@{user.userName} -->
            <variable
                name="user"
                type="com.ha.cjy.databingdemo.model.UserModel"/>
            <variable
                name="presenter"
                type="com.ha.cjy.databingdemo.MainActivityPresenter"/>
        </data>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_margin="12dp"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="12dp"
                android:textSize="16sp"
                android:background="@android:color/white"
                android:textColor="@color/colorPrimary"
                android:hint="显示用户名"
                android:text="@{user.userName}"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="12dp"
                android:padding="12dp"
                android:textSize="16sp"
                android:background="@android:color/white"
                android:textColor="@color/colorPrimary"
                android:hint="显示手机号码"
                android:text="@{user.telPhone}"
                />
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_marginTop="12dp"
                android:background="@color/colorPrimary"/>
            <EditText
                android:id="@+id/et_userName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="12dp"
                android:padding="12dp"
                android:textSize="16sp"
                android:background="@android:color/white"
                android:textColor="@color/colorPrimary"
                android:hint="输入用户名"
                />
            <EditText
                android:id="@+id/et_telPhone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="12dp"
                android:padding="12dp"
                android:textSize="16sp"
                android:background="@android:color/white"
                android:textColor="@color/colorPrimary"
                android:hint="输入手机号码"
                />
            <Button
                android:id="@+id/btn_update"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="12dp"
                android:padding="12dp"
                android:textSize="16sp"
                android:background="@color/colorPrimary"
                android:textColor="#FFFFFF"
                android:text="更新数据"
                android:onClick="@{presenter.onClickEvent}"
                />
        </LinearLayout>
    </layout>
    

    3、代码

    在ManiActivity中,需要为布局和数据进行绑定操作:DataBindingUtil.setContentView(Activity activity, int layoutId)

    package com.ha.cjy.databingdemo;
    
    import android.databinding.DataBindingUtil;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    
    import com.ha.cjy.databingdemo.databinding.ActivityMainBinding;
    import com.ha.cjy.databingdemo.model.UserModel;
    
    public class MainActivity extends AppCompatActivity implements MainActivityPresenter{
        //对应的是layout文件名,后缀Binding,这个是自动生成的
        private ActivityMainBinding binding;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
            binding.setPresenter(this);
            UserModel userModel = new UserModel("测试姓名","18012365485");
            binding.setUser(userModel);
        }
    
    
        @Override
        public void onClickEvent(View view) {
            //注意:使用DataBinding,控件的获取应该使用DataBinding对象,而不是通过findViewById获取(这样的方式获取不到控件的文本内容)
            userModel.setUserName(binding.etUserName.getText().toString());
            userModel.setTelPhone(binding.etTelPhone.getText().toString());
    
            binding.setUser(userModel);
        }
    }
    

    这样子做,就完成了一个简单的dataBinding的使用,代码也比以前简洁了许多。

    但是,看到这里,同学们不禁要问了:“不是说dataBinding的核心功能是实现单向数据绑定呀,没有看到呀,还是以前取出输入的文本重新赋值的做法,只是实现形式不一样而已。”
    没错,这样的做法确实没有体现出单向绑定数据功能。接下来,我们来改造一下代码。

    package com.ha.cjy.databingdemo;
    
    import android.databinding.DataBindingUtil;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    
    import com.ha.cjy.databingdemo.databinding.ActivityMainBinding;
    import com.ha.cjy.databingdemo.model.UserModel;
    
    public class MainActivity extends AppCompatActivity implements MainActivityPresenter{
        //对应的是layout文件名,后缀Binding,这个是自动生成的
        private ActivityMainBinding binding;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //进行DataBinding绑定
            binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
            binding.setPresenter(this);
            UserModel userModel = new UserModel("测试姓名","18012365485");
            binding.setUser(userModel);
        }
    
        @Override
        public void onClickEvent(View view) {
            //注意:使用DataBinding,控件的获取应该使用DataBinding对象,而不是通过findViewById获取(这样的方式获取不到控件的文本内容)
            binding.getUser().setUserName(binding.etUserName.getText().toString());
            binding.getUser().setTelPhone(binding.etTelPhone.getText().toString());
        }
    }
    

    看下这句代码:binding.getUser().setUserName(binding.etUserName.getText().toString());我们使用dataBinding获取声明过的User对象,然后为其属性userName赋值。看到这里,我们也只是看到更改了数据,没有看到任何更新UI的代码。不要急,我们接着看一下数据类UserModel的实现就明白了。

    package com.ha.cjy.databingdemo.model;
    
    import android.databinding.BaseObservable;
    import android.databinding.Bindable;
    
    import com.ha.cjy.databingdemo.BR;
    
    /**
     * 用户
     * Created by cjy on 17/12/5.
     */
    
    public class UserModel extends BaseObservable {
        /**
         * 用户名
         */
        //注解 数据变动更新UI更新
        @Bindable
        private String userName;
        /**
         * 手机号码
         */
        @Bindable
        private String telPhone;
    
        public UserModel() {
        }
    
        public UserModel(String userName, String telPhone) {
            this.userName = userName;
            this.telPhone = telPhone;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
            //与@Bindable配合使用,数据有更新,通知UI跟着更新
            notifyPropertyChanged(BR.userName);
        }
    
        public String getTelPhone() {
            return telPhone;
        }
    
        public void setTelPhone(String telPhone) {
            this.telPhone = telPhone;
            notifyPropertyChanged(BR.telPhone);
        }
    }
    

    由上面代码中,我们看到了注解Bindable,这个是用来标识属性是否有变动。官方介绍如下:

    The Bindable annotation should be applied to any getter accessor method of an
     * {@link Observable} class. Bindable will generate a field in the BR class to identify
     * the field that has changed.
    

    当然了,只是标识属性变动是不够的,这时还是没有通知UI更新的。我们需要使用notifyPropertyChanged方法,告知UI数据变化了从而更新UI。注意,notifyPropertyChanged方法的参数需要使用BR.属性名才可以。dataBinding在BR类中为对象属性生成了唯一的标识码。

    总结

    看到这里基础的入门介绍就讲完了,其实还有很多更高级的用法,比如在RecyclerView中怎么用等等,大家可以去自己查阅资料学习,这样认识的可以更深刻。希望这篇文章对大家能够有所帮助。

    相关文章

      网友评论

          本文标题:Android-DataBinding入门系列(一)基本介绍

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