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