Data Binding初步体验

前言

Data Binding,就是数据绑定的意思。Data Binding 在布局文件中实现数据绑定声明,使数据的变化引起视图的自动更新,减少了逻辑代码,在Android中可以很方便的实现MVVM的开发模式。但如果我项目没有用MVVM模式,是不是就不能用了呢?那当然是可以的啦,也可以用来装装逼啊。

使用

在app里面添加,这样子就可以使用了,但开启后,应用总方法数好像多了很多。

android {
    ....
    dataBinding {
        enabled = true    
    }    
}
绑定数据

先建立一个bean类,和平时的一毛一样

public class User {
   public String firstName;
   public String lastName;

   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
}

然后,布局写成这样

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="user"
            type="mmc.databindingtest.User" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}" />

    </LinearLayout>
</layout>

注意了,布局和以前的不一样,首先根标签是 <layout >,然后里面有一个<data>标签,这里是声明变量和指定的实体类的。这里声明的变量“user”,可以在下面的布局使用,"type"则需要填写完整的实体类名。

    <data>
        <variable
            name="user"
            type="mmc.databindingtest.User" />
    </data>

然后布局内容,里面的控件需要改一下啦,@{user.firstName} ,user是上面定义的变量名,注意了,firstName这个变量是必须在你实体类里面已经定义的,不然编译不通过。

<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}" />

最后在activity里面调用就行了

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        User user = new User("景", "天");
        binding.setUser(user);
    }
}

ActivityMainBinding这个是自动生成的,是根据你布局R.layout.activity_main转换成的,对比一下就知道他的规则了,驼峰加后缀“Binding”。如无意外,app的Textview就会显示“景天”了。

绑定控件事件

如果要绑定控件的点击事件的话,在实体类里面添加方法

public class User {
    public String firstName;
    public String lastName;

    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public void onClickName(View view) {
        Toast.makeText(view.getContext(), "点击了名字", Toast.LENGTH_SHORT).show();
    }
}

然后布局里面声明一下就行了

<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{user.onClickName}"
            android:clickable="true"
            android:text="@{user.firstName}" />

同样需要注意的是,onClick里面的方法名要和实体类的一样才行

深入layout

使用Import元素,先添加引用 <import type="android.view.View" />

 <data>

        <import type="android.view.View" />

        <variable
            name="user"
            type="mmc.databindingtest.User" />

    </data>

然后使用,结合表达式

 <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:onClick="@{user.onClickName}"
            android:text="@{user.firstName}"
            android:visibility="@{user.age > 9 ? View.VISIBLE : View.GONE}" />

这样,age大于9就显示了,不用再在activity里面判断了。

疑问

我看到官方文档写着

<data>
    <import type="com.example.User"/>
    <import type="java.util.List"/>
    <variable name="user" type="User"/>
    <variable name="userList" type="List<User>"/>
 </data>

这样来引用list,用来绑定list的数据,很多博客都这么搬过来,但我自己试了下,编译的是就会报错。
提示:

Error:Execution failed for task ':databindingtest:dataBindingProcessLayoutsDebug'.> org.xml.sax.SAXParseException; 
systemId:file:/D:/Project/Name_yiqiming/databindingtest/build/intermediates/res/merged/debug/layout/activity_main.xml; lineNumber: 25; columnNumber: 49; 
与元素类型 "variable" 相关联的 "type" 属性值不能包含 '<' 字符。

错误里面明确告诉我们,type里面不能包含“<”符合,那List<User>又怎么丢进去的,还望知道的朋友说一下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容