美文网首页
DataBinding使用与解惑

DataBinding使用与解惑

作者: 海重山青 | 来源:发表于2018-03-16 10:53 被阅读0次

    简介

    DataBinding框架是Google2015年的I/O大会上推出的。为了解决将数据传送到View上的问题。

    • 按照一般的做法,我们书写xml布局,Activity上查找控件。将数据展示到控件上。
    • DataBinding将这一过程简化
      • 我们在xml布局的控件上直接就能使用数据
      • Activity一句代码就能将数据发送到控件
      • 极简的方式实现这一过程

    使用

    第一步:开启DataBinding

    由于DataBindingGoogle官方推出的,不属于第三方。我们可以直接在AS中使用,不过使用之前需要将其开启

    android {
        dataBinding {
            enabled = true
        }
    }
    
    • 这几行代码很简单,能看出来意思是开启dataBinding
    • 我们都知道AS依靠Gradle管理项目。而创建项目和编译都需要执行很多任务,相信开发人员都见过。
    gradle_task.png
    • 而这里面也有DataBinding相关的任务,只不过默认是禁止的。所以我们只需开启即可。

    第二步:VM绑定

    设置布局之前需要有Bean的存在,不然怎么绑定?

    public class User {
    
        private String name;    // 姓名
        private int age;        // 年龄
        private int gender;     // 性别
    
        public User(String name, int age, int gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public int getGender() {
            return gender;
        }
    
        public void setGender(int gender) {
            this.gender = gender;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender=" + gender +
                    '}';
        }
    }
    

    有这个实体类就够了,接下来要设置布局了。这里设置的activity_main.xml布局。

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
        <data>
            <variable
                name="user"
                type="com.cx.databindingdemo.bean.User" />
        </data>
    
        <!-- 线性布局 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <!--显示User对象的name-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"/>
    
            <!--显示User对象的age-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{String.valueOf(user.age)}"/>
    
            <!--显示User对象的gender-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{String.valueOf(user.gender)}"/>
    
        </LinearLayout>
    
    </layout>
    
    
    • 可以看见布局发生了变化。不过这也算是个模板布局,以后我们在编写布局时也要照这个形式编写。
    • 结构是layout节点为根布局,里面有data和真实布局两个子节点
      • 真实布局就是我们自己的界面布局
    • data中的variable变量是供布局使用
      • name设置的user可以看到,TextView上的展示内容属性都在引用着
        • @{user.name}
      • type类型的意思,指向Bean类。这样,我们我们使用user.时才会提示。
    • 控件绑定数据的方式就是:@{变量.属性}
      • 因为此值必须String类型,所以不是String类型的agegender要强转一下

    步骤三:发送数据

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
            User user = new User("王大力", 18, 1);
            activityMainBinding.setUser(user);
        }
    }
    
    • DataBindingUtil类的静态方法设置布局后返回一个ViewDataBinding。我们可以用这个对象调用User的方法,因为经过布局的绑定之后。DataBindingUtil.setContentView()拿到了这个绑定。
    • 一句话就将数据发送到View上。
    • 这个ActivityMainBinding是系统自动生成的,而且不需要编译。缺点是不能调试不能看源码Ctrl点进去只会调到布局文件中去。如果想调试只能手动编译代码
    • 还有ActivityMainBinding这个名字的生成也是有规则的,根据布局名称来:
      • activity_main.xml,所以生成了ActivityMainBinding

    运行结果

    运行结果.png

    小结

    • 从原始的强转findViewById(),大量的重复性代码
    • ButterKnife,使用注解绑定。
    • 再到DataBindingVM绑定。
    • 开发越来越简洁

    相关文章

      网友评论

          本文标题:DataBinding使用与解惑

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