DataBinding绑定布局,也是MVVM框架中使用的,避免了写入大量的findviewbyID,一个复杂的界面往往有着数量庞大的ID,每一次赋值或者调用都需要费力去查找, 就算是有一些第三方软件,可以自动写入findviewbyID,但是点击事件的处理,逻辑的整理以及各总各样的互相调用赋值影响足够要人老命了。

而DataBinding框架,是将布局文件跟我们使用的类绑定起来,也就是绑定视图,可以直接进行更新,只要你没写错,那么以后就不用再去想那些什么点击按钮变色啊,变字体啊,改变值啊之类的一些列重复性操作。

下面就是简单的一些例子:

首先,是导入依赖,在build.grild文件的Android中添加:


dataBinding { enabled = true }


然后,就是绑定布局。

<?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>
        <import type="qnkj.cn.mylianxi.bean.MyBean"/>
        <variable
            name="name"
            type="qnkj.cn.mylianxi.bean.MyBean"
        />

    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <TextView
            android:id="@+id/tv_my"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{name.name}"
            />
        <TextView
            android:id="@+id/tv_my2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@{name.age+``}"
            />
    </LinearLayout>
</layout>

这是最简单的一个例子,设置一个Bean类MyBean,里面只有一个姓名和年龄的字段,为了方便我就全写成了字符串。

其中,data字段中间,写的是绑定表达式,用哪个进行绑定,其中variable字段内部,name是名字,type是路径,我的就是MyBean的路径。

然后就是data下面的LinearLayout布局,就是正常布局,内部两个显示用的TextView,正常的设置ID, 需要注意的是text,里面的@{name.name},就是将上面绑定的name字段,也就是那个MyBean中的name属性传入进来,下面的@{name.age+``}也是一个意思,调用age字段

需要注意一点!这里的``是键盘的tab键上面的那个键,数字键1左面的那个英文姿态,代表着字符串的""号,“”也能用,不过有时会是另一个意思,因为输入数字会报错的,也可以用另一种方法转义:@{String.valueOf(age)}.


然后就是在我们的MainActivity中进行调用了。

ActivityMainBinding binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);

这是绑定布局文件,最前面的名字并不是固定的,是我们布局文件首字母大写,去掉下划线后在首字母大写,再加上Binding组成,很好记吧。

接下来就是对我们的布局属性进行赋值了。

MyBean userBean2=new MyBean("张三",12);
binding.setName(userBean2);


这就完成了,很简单吧,在编译时系统会自动将MyBean中的值根据我们再布局中设置的进行带入,完成绑定,下面是完整代码,注意一下的是我用的是MyActivity类,不是Main的,别搞错了。

布局:

<?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>
        <import type="qnkj.cn.mylianxi.bean.MyBean"/>
        <variable
            name="name"
            type="qnkj.cn.mylianxi.bean.MyBean"
        />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <TextView
            android:id="@+id/tv_my"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{name.name}"
            />
        <TextView
            android:id="@+id/tv_my2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@{name.age+``}"
            />
    </LinearLayout>
</layout>

Activity:

public class MyActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         ActivityMyBinding binding=DataBindingUtil.setContentView(MyActivity.this,R.layout.activity_my);
        MyBean userBean2=new MyBean("张三",12);
        binding.setName(userBean2);
    }
}

在直接写的时候ActivityMyBinding会报错,在布局中写上import标签就可以了。


写的有点乱,如果看不明白可以多看看别人的博客,试着敲一下,就会好些。