Android Data Binding 入门
参考
配置环境 build.gradle
android {
......
// dataBinding 加入
dataBinding {
enabled = true
}
......
}
布局文件
最外层根节点变为==layout==,新增节点==data==用来存放页面可能用的数据以及方法
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!--
<data class="">
<import type="com.smq.databanding.User" />
<variable
name="aaa"
type="User" />
</data>
-->
<RelativeLayout
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
</layout>
- 默认生成规则
根据layout的文件名来生成对应的Binding类,例如==R.layout.activity_main==对应生成的类名为==ActivityMainBinding==。自动生成的类在build目录下,as中不可见。
- Variable和import
这两个标签是在layout资源文件中data标签的下级标签,其中variable标签可以独自使用,其独自使用方法如下:
<data>
<variable name="user" type="com.smq.databanding.User" />
</data>
其中name对应的字段会在具体view控件赋值时用到,type字段对应值是具体引用的类的全路径。
variable和import方法联合使用方法如下:
<data>
<import type="com.smq.databanding.User"/>
<variable name="user" type="User" />
</data>
多个路径类名相同的解决方法
<import type="com.example.home.data.User" />
<import type="com.examle.detail.data.User" alias="DetailUser" />
<variable name="user" type="DetailUser" />
绑定variable
当设置了variable标签后,框架会自动生成一个继承自ViewDataBinding的类,如果data中有class属性,比如
<data class="com.smq.databanding.CustomBinding" >
<import alias="User2" type="com.smq.databanding.User" />
<variable name="user" type="User2" />
</data>
则生成的类名为CustomBinding,否则就根据layout的文件名来生成对应的Binding类,例如R.layout.activity_main对应生成的类名为ActivityMainBinding。自动生成的类在build目录下,as中不可见。
- 具体在Activity中的绑定方法如下
public class MainActivity extends AppCompatActivity {
//MainBanding dataBinding;
ActivityMainBinding dataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
init();
}
private void init() {
dataBinding.setUser(new User("zhangfei", 18));
}
}
- XML中使用,样例
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import alias="User2" type="com.smq.databanding.User" />
<variable name="user" type="User2" />
</data>
<RelativeLayout
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name + user.age}" />
</RelativeLayout>
</layout>
- java类静态方法的使用
首先定义一个静态方法
public class MyStringUtils {
public static String capitalize(final String word) {
if (word.length() > 1) {
return String.valueOf(word.charAt(0)).toUpperCase() + word.substring(1);
}
return word;
}
}
然后在 xml 的 data 节点中导入:
<import type="com.liangfeizc.databindingsamples.utils.MyStringUtils" />
使用方法与 Java 语法一样:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{MyStringUtils.capitalize(user.firstName)}" />