美文网首页Jetpack
Android DataBinding(一)之 基本使用

Android DataBinding(一)之 基本使用

作者: Sharkchilli | 来源:发表于2020-12-23 17:52 被阅读0次

    前言

    DataBinding是谷歌开发的一个框架,主要做的就是让界面和数据绑定,数据变动的时候界面也随之变动。如果学过vue.js应该就知道这两者是类似的。DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常

    配置

    我们需要在Model 的 build.gradle加入DataBinding 的支持,可以看到这和添加其他第三方类库不太一样,有一种亲儿子的感觉

    android {
        dataBinding {
            enabled = true
        }
    }
    

    简单使用

    打开布局文件,选中根布局的 ViewGroup,按住 Alt + 回车键,点击 “Convert to data binding layout”,就可以生成 DataBinding 需要的布局规则


    image.png

    点击后原文件会变成下面

    <?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"
        xmlns:tools="http://schemas.android.com/tools">
    
        <data>
    
        </data>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
    
        </LinearLayout>
    </layout>
    

    其实就是使用layout标签将原来的布局包住,再在里面添加了data标签,data标签就是来声明Model类的,所以接下来我们定义一个模型吧

    package com.shart.model;
    
    public class User {
        private String name;
        private String age;
    
        public User(String name, String age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    }
    
    

    接下来就可以在布局文件中关联model和视图的关系了

    <data>
            <import type="com.shart.model.User" />
    
            <variable
                name="userInfo"
                type="User" />
        </data>
    

    import为引入这个类型,也可以在variable的type属性中使用全类名。还可以在improt的属性中使用alias别名
    在data中定义完类型后就可以在视图中使用了

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            tools:context=".MainActivity">
    
            <TextView
                android:id="@+id/tv_userName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@{userInfo.name,default=zhoufan}" />
    
            <TextView
                android:id="@+id/tv_password"
                android:layout_marginTop="50dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@{userInfo.age}" />
    
        </LinearLayout>
    

    通过 @{userInfo.name} 使 TextView 引用到相关的变量,DataBinding 会将之映射到相应的getter方法
    最后我们在Activity中去使用它

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.activity_main);
            ActivityMainBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
            User user = new User("fujie", "23");
            viewDataBinding.setUserInfo(user);
        }
    

    原本的setContentView被 DataBindingUtil.setContentView代替,其返回的是自动生成的布局文件对象

    每个数据绑定布局文件都会生成一个绑定类,ViewDataBinding 的实例名是根据布局文件名来生成,将之改为首字母大写的驼峰命名法来命名,并省略布局文件名包含的下划线。控件的获取方式类似,但首字母小写

    运行

    image.png
    注意
    这里如果你的类路径写错,DataBinding很可能不会报出明显的错误。而是报它自动生成的类找不到。这是很恶心人的地方,所以你要去检测你的布局文件的类名是否写错。

    参考

    Android DataBinding 从入门到进阶

    相关文章

      网友评论

        本文标题:Android DataBinding(一)之 基本使用

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