Data Binding初步体验

作者: 在寻找雪见的景天 | 来源:发表于2017-05-26 01:22 被阅读137次

    前言

    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>又怎么丢进去的,还望知道的朋友说一下

    相关文章

      网友评论

        本文标题:Data Binding初步体验

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