DataBinding的使用(一)
1.DataBinding的简介
2.使用前的准备工作
3.开始初步学习
DataBinding简介
DataBinding是谷歌官方发布的一个实现数据绑定的框架,同时也是因为有了它可以在Android上实现MVVM框架,增强了xml文件的功能,大幅度的简化了代码量。
- xml中只做简单的运算,例如:赋值,判空等,不做复杂的运算
准备工作
(1)启用DataBinding
- 在app文件夹下的build.gradle中添加
android {
...
buildFeatures {
dataBinding true
}
}
(2)布局文件
找到相应的布局文件后,改为如下模式:
在Android Studio中可以使用快捷键实现:
Windows请按快捷键 Alt + 回车
Mac请按快捷键 option + 回车
初步学习
单变量
- 在布局文件中的标签中定义变量
- 在variable中定义变量名称和类型
【name中定义变量名称,type中定义变量类型】
- 在variable中定义变量名称和类型
<variable
name="show"
type="java.lang.String" />
- 在imporet中引入使用变量的包名,以及别称
(1)自定义类的包导入
<import type="com.example.databinding.Goods" />
<variable
name="goods"
type="Goods" />
自定义类应符合标准类名要求,首字母大写,否则会出现 Cause: couldn’t make a guess for {Class Name}错误
(2)非自定义包的导入
【alias中自定义包名】
- 一般用类名作为包名,而在实际运用过程中我们可能会在不同路径下写类名相同的类,此时易混淆,我们要使用alias自定义包名来区分
<import type="androidx.databinding.ObservableList"
alias="List"/>
<variable
name="fruit"
type="List" />
- 引用数据时使用@{ }形式
【default可以定义变量的默认值】
- default定义的默认值只能在相应的Design中显示判断文字的位置,大小等信息,不会出现在运行的程序中
- 每个数据绑定布局文件都会生成一个绑定类,ViewDataBinding 的实例名是根据布局文件名来生成,将之改为首字母大写的驼峰命名法来命名,并省略布局文件名包含的下划线。也可以通过如下方式自定义 ViewDataBinding 的实例名
<data class="MainActivityBinding">
```
</data>
layout具体实现代码:
<?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>
<variable
name="first"
type="java.lang.String" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50dp"
android:text="@{first,default = my_first}"/>
</LinearLayout>
</layout>
- 接下来我们就要初始化对象,给对象赋值了。
(1)在对应的Activity中获取DataBinding对象
private ActivityMainBinding binding;
(2)在我们将Activity的onCreate方法中将原来的setContentView去设置布局的方法替换成DataBindingUtil类的一个静态方法setContentView去设置布局:
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
(3)初始化对象并赋值
binding.setFirst("xxx");
完整代码:
DataBinding也可以用于Fragment中
public class ThisFragment extends Fragment {
private ThisFragmentBinding binding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.this_fragment, container, false);
return binding.getRoot();
}
}
全部代码:git地址