DataBinding---MVVM模式
程序员文章站
2022-05-14 23:47:03
...
简介
Data binding 是Google在2015年7月发布的Android Studio v1.3.0 版本上引入的,在2016年4月Android Studio v2.0.0 上正式支持。引入之初,不支持双向绑定,目前已经支持了。
DataBinding 是基于MVVM思想实现数据和UI绑定的的框架,有了 Data Binding,在Android中也可以很方便的实现MVVM。
在引入DataBinding之前,我们需要敲很多很鸡肋的代码,如 findViewById()、setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通过 Data Binding , 我们可以通过声明式布局以精简的代码来绑定应用程序逻辑和布局,这样就不用编写大量的毫无营养的代码了。
DataBinding 是基于MVVM思想实现数据和UI绑定的的框架,有了 Data Binding,在Android中也可以很方便的实现MVVM。
在引入DataBinding之前,我们需要敲很多很鸡肋的代码,如 findViewById()、setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通过 Data Binding , 我们可以通过声明式布局以精简的代码来绑定应用程序逻辑和布局,这样就不用编写大量的毫无营养的代码了。
DataBinding 是一个support库,最低支持到Android 2.1(API Level 7+)
环境构建
1、先下载最新的 Support repository和Google Repository,如果在引入过程中报如下错误,一把就是由于没有升级前两个库造成的
2、在Module的build.gradle文件中的android节点下做如下配置:
3、要求
Android Plugin for Gradle: 1.5.0-alpha1及以上
Android Studio 1.3及以上
Android Studio 1.3及以上
具体使用方式
简单数据绑定
1、布局文件将更节点变为layout节点并引入data节点,同时创建好需要用到的Model
-
<layout xmlns:android=“http://schemas.android.com/apk/res/android”
-
xmlns:tools=“http://schemas.android.com/tools”>
-
-
<data>
-
<variable
-
name=“user”
-
type=“com.victor.databinding.User”/>
-
</data>
-
public class User {
-
-
public String firstName;
-
public String lastName;
-
public String phone; // 电话
-
public boolean isShowPhone;
-
-
/**
-
* 获取全名
-
* @param firstName
-
* @param lastName
-
* @return
-
*/
-
public String getFullName(String firstName, String lastName) {
-
StringBuilder sb = new StringBuilder();
-
sb.append("全名:");
-
if (!TextUtils.isEmpty(firstName)) {
-
sb.append(firstName);
-
}
-
if (!TextUtils.isEmpty(lastName)) {
-
sb.append("." + lastName);
-
}
-
return sb.toString();
-
}
-
}
其中data节点下一个variable节点代表一个变量,name属性根据需要自己取名,type为需要用到的Model的全路径,功能相当于写代码的时候引入一个类的功能
2、在Activity中,用 DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentView(int layoutId),同时初始化数据,并进行绑定
-
public class MainActivity extends AppCompatActivity {
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
// 要用setContentView(Activity activity, int layoutId)代替该方法
-
//setContentView(R.layout.activity_main);
-
-
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
-
-
// 初始化数据
-
User user = new User();
-
user.firstName = “Victor”;
-
user.lastName = “Fang”;
-
user.phone = “13333333333”;
-
user.isShowPhone = false;
-
// 绑定数据
-
binding.setUser(user);
-
}
其中ActivityMainBinding是根据你绑定的布局文件的名称去掉下划线后加上Binding,由系统自动生成。
3、在布局文件中使用数据绑定
-
<TextView
-
android:layout_width=“wrap_content”
-
android:layout_height=”wrap_content
-
android:text=”@{user.firstName}”/>
其中user就是你第一步定义data节点下的变量(variable)中name属性值。firstName是Model中的变量名将app跑起来就能看到TextView已经能展示数据了
三元表达式
DataBinding还支持三元表达式功能,如在布局文件中添加如下节点
但是需要注意的是:引用了API原有的类,如View,是需要通过import节点导入的,不然会报错
-
<data>
-
<!–<import type=”com.victor.databinding.User”/>–>
-
<import type=“android.view.View”/>
-
<!– 三元表达式 –>
-
<TextView
-
android:layout_width=“wrap_content”
-
android:layout_height=“wrap_content”
-
android:text=“@{user.phone}”
-
android:visibility=“@{user.isShowPhone ? View.VISIBLE : View.GONE}”/>
一开始我们初始user的时候,isShowPhone = false,所以不会看到有电话号码显示(下左图),如果我们将isShowPhone改为true,显示如下右图方法事件绑定
DataBinding除了支持数据绑定外,还可以绑定方法和监听事件
普通方法的绑定,直接在布局文件中,通过变量名调用方法即可,和java代码里面使用相似
-
<!–类方法的绑定–>
-
<TextView
-
android:layout_width=“wrap_content”
-
android:layout_height=“wrap_content”
-
android:text=“@{user.getFullName(user.firstName, user.lastName)}”/> <!–调用User类里面的获取全名的方法–>
显示效果:
事件绑定
类似于 android:onClick 可以指定 Activity 中的函数,Data Binding 也允许处理从视图中发送的事件。有两种实现方式:
方法调用和监听绑定
二者主要区别在于方法调用在编译时处理,而监听绑定于事件发生时处理。
方法调用和监听绑定
二者主要区别在于方法调用在编译时处理,而监听绑定于事件发生时处理。
方法调用
-
<!–事件绑定–>
-
<Button
-
android:layout_width=“wrap_content”
-
android:layout_height=“wrap_content”
-
android:text=“ShowToast”
-
android:onClick=“@{handler::showTost}”/>
其中用的handler类创建后也许通过data节点下引入
-
public class MyHandler {
-
-
public void showTost(View view) {
-
Toast.makeText(view.getContext(), “展示吐司”, Toast.LENGTH_SHORT).show();
-
}
-
-
public void onEventListenerExecute(MyTask task) {
-
task.run();
-
}
-
-
}
-
<variable
-
name=“handler”
-
type=“com.victor.databinding.MyHandler”/>
这样不用再代码里面写任何事件监听的代码,就能够相应按钮的点击事件
监听绑定
需要注意的是:此功能在 Android Gradle Plugin version 2.0 或更新版本上可用,支持lambda表达式
在方法引用中,方法的参数必须与监听器对象的参数相匹配。
而在监听绑定中,只要返回值与监听器对象的预期返回值相匹配即可
布局文件
-
<!– 监听绑定 使用lambda表达式 –>
-
<Button
-
android:layout_width=“wrap_content”
-
android:layout_height=“wrap_content”
-
android:text=“runTask”
-
android:onClick=“@{() -> handler.onEventListenerExecute(task)}”/>
Task类如下展示效果:
public class MyTask implements Runnable { private Context mContext; public MyTask(Context context) { mContext = context; } @Override public void run() { Toast.makeText(mContext, “执行任务”, Toast.LENGTH_SHORT).show(); } }