Android DataBinding介绍(一)——简介、数据及方法事件绑定

Android DataBinding介绍(一)——简介、数据及方法事件绑定

简介

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 是一个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及以上

具体使用方式

简单数据绑定

1、布局文件将更节点变为layout节点并引入data节点,同时创建好需要用到的Model
  1. <layout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools= "http://schemas.android.com/tools">
  3. <data>
  4. <variable
  5. name= "user"
  6. type= "com.victor.databinding.User"/>
  7. </data>
  1. public class User {
  2. public String firstName;
  3. public String lastName;
  4. public String phone; // 电话
  5. public boolean isShowPhone;
  6. /**
  7. * 获取全名
  8. * @param firstName
  9. * @param lastName
  10. * @return
  11. */
  12. public String getFullName(String firstName, String lastName) {
  13. StringBuilder sb = new StringBuilder();
  14. sb.append( "全名:");
  15. if (!TextUtils.isEmpty(firstName)) {
  16. sb.append(firstName);
  17. }
  18. if (!TextUtils.isEmpty(lastName)) {
  19. sb.append( "." + lastName);
  20. }
  21. return sb.toString();
  22. }
  23. }

其中data节点下一个variable节点代表一个变量,name属性根据需要自己取名,type为需要用到的Model的全路径,功能相当于写代码的时候引入一个类的功能

2、在Activity中,用 DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentView(int layoutId),同时初始化数据,并进行绑定
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. // 要用setContentView(Activity activity, int layoutId)代替该方法
  6. //setContentView(R.layout.activity_main);
  7. ActivityMainBinding binding = DataBindingUtil.setContentView( this, R.layout.activity_main);
  8. // 初始化数据
  9. User user = new User();
  10. user.firstName = "Victor";
  11. user.lastName = "Fang";
  12. user.phone = "13333333333";
  13. user.isShowPhone = false;
  14. // 绑定数据
  15. binding.setUser(user);
  16. }
其中ActivityMainBinding是根据你绑定的布局文件的名称去掉下划线后加上Binding,由系统自动生成。

3、 在布局文件中使用数据绑定
  1. <TextView
  2. android:layout_width= "wrap_content"
  3. android:layout_height= "wrap_content
  4. android:text="@{ user.firstName}"/>
其中user就是你第一步定义data节点下的变量(variable)中name属性值。firstName是Model中的变量名
将app跑起来就能看到TextView已经能展示数据了


三元表达式

DataBinding还支持三元表达式功能,如在布局文件中添加如下节点
但是需要注意的是:引用了API原有的类,如View,是需要通过import节点导入的,不然会报错
  1. <data>
  2. <!--<import type="com.victor.databinding.User"/>-->
  3. <import type="android.view.View"/>


  1. <!-- 三元表达式 -->
  2. <TextView
  3. android:layout_width= "wrap_content"
  4. android:layout_height= "wrap_content"
  5. android:text= "@{user.phone}"
  6. android:visibility= "@{user.isShowPhone ? View.VISIBLE : View.GONE}"/>
一开始我们初始user的时候,isShowPhone = false,所以不会看到有电话号码显示(下左图),如果我们将isShowPhone改为true,显示如下右图


方法事件绑定

DataBinding除了支持数据绑定外,还可以绑定方法和监听事件

普通方法的绑定,直接在布局文件中,通过变量名调用方法即可, 和java代码里面使用相似
  1. <!--类方法的绑定-->
  2. <TextView
  3. android:layout_width= "wrap_content"
  4. android:layout_height= "wrap_content"
  5. android:text= "@{user.getFullName(user.firstName, user.lastName)}"/> <!--调用User类里面的获取全名的方法-->
显示效果:


事件绑定
类似于 android:onClick 可以指定 Activity 中的函数,Data Binding 也允许处理从视图中发送的事件。有两种实现方式:
方法调用和监听绑定
二者主要区别在于方法调用在编译时处理,而监听绑定于事件发生时处理。
方法调用
  1. <!--事件绑定-->
  2. <Button
  3. android:layout_width= "wrap_content"
  4. android:layout_height= "wrap_content"
  5. android:text= "ShowToast"
  6. android:onClick= "@{handler::showTost}"/>
其中用的handler类创建后也许通过data节点下引入
  1. public class MyHandler {
  2. public void showTost(View view) {
  3. Toast.makeText(view.getContext(), "展示吐司", Toast.LENGTH_SHORT).show();
  4. }
  5. public void onEventListenerExecute(MyTask task) {
  6. task.run();
  7. }
  8. }


  1. <variable
  2. name= "handler"
  3. type= "com.victor.databinding.MyHandler"/>
这样不用再代码里面写任何事件监听的代码,就能够相应按钮的点击事件
监听绑定
需要注意的是:此功能在 Android Gradle Plugin version 2.0 或更新版本上可用,支持lambda表达式
在方法引用中,方法的参数必须与监听器对象的参数相匹配。
在监听绑定中,只要返回值与监听器对象的预期返回值相匹配即可
布局文件
  1. <!-- 监听绑定 使用lambda表达式 -->
  2. <Button
  3. android:layout_width= "wrap_content"
  4. android:layout_height= "wrap_content"
  5. android:text= "runTask"
  6. android:onClick= "@{() -> handler.onEventListenerExecute(task)}"/>
Task类如下
  1. public class MyTask implements Runnable {
  2. private Context mContext;
  3. public MyTask(Context context) {
  4. mContext = context;
  5. }
  6. @Override
  7. public void run() {
  8. Toast.makeText(mContext, "执行任务", Toast.LENGTH_SHORT).show();
  9. }
  10. }
展示效果:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值