初步认识android databinding
来源:互联网 发布:ubuntu 动态库路径 编辑:程序博客网 时间:2024/06/06 07:07
我先说一下我公司的情况,然后再说对android databinding的认识记得去年6月份,我们公司开发的项目(主要是针对餐饮的)走进了市场,遇到了一些问题。客户都说我们产品虽然有一定的好处,但不够便捷,如果能有一个点餐系统来配合使用,一定会更好的。公司一直遵循客户是上帝,于是苦逼的工作自然就落到了我们开发部的头上了。于是就收集资料,模仿别人现有的产品----食通天,根据别人的成熟产品,自己定需求,定好需求,设计好数据库,接下来的时间就是考虑要用什么语言来开发了,于是在领导的光明指导下,说“那就用C#”来开发吧!按理说,使用什么语言来开发都是没有什么问题的,谁叫咱是开发部呢?可是现在面临着这么一个问题,我们部门比较小,总人数就10人,其中包括3个测试,3个java,1个安卓,1个iOS,一个UI,一个项目经理,一个产品经理。另外,测试、UI、产品经理、项目经理是不进行开发的。那就仅剩3个java和1个android、1个iOS了。有没有发现什么?没错,我们都不是做C#的,没有一个人接触过C#,于是iOS走了,项目经理也走了。那只能剩下苦逼的我android和3个java了。于是就学呗,用一个星期的时间了解了C#,发现C#其实跟java差不多,语法基本都一样,容易理解。好吧,懂得基本情况,就开发呗!好吧,开干!!在进行点餐系统的开发过程中,我发现了一个在android领域中还没有引入的框架:MVVM。对,你没有看错,就是MVVM,它是一种采用数据绑定的一种开发模式,可以完美的把视图xaml、数据、业务逻辑进行完美的解耦。这个点餐系统的项目,完美经历了4个月的加班加班加班,终于完工了,但整个项目所使用到的技术中给我印象最深刻的是C#的数据绑定这模块,自此,我对数据绑定有了初步的概念。好了,闲话已经说了不少了,开始说说我们的android吧去年的Google IO 大会上,Android 团队发布了一个数据绑定框架(Data Binding Library) 。以后可以直接在 layout 布局 xml 文件中绑定数据了,无需再 findViewById 然后手工设置数据了。其语法和使用方式和 JSP 中的 EL 表达式非常类似。但由于,可能当时我在做C#开发,无暇顾及android的情况,直到今年初,我没有那么忙时,才发现了android已经开始可以使用数据绑定了。那么,在android上如何使用databinding的呢?使用步骤(开发工具android studio):1.配置buid.grade文件2.定义数据实体3.布局文件中声明实体,绑定控件4.java代码引用,填充实体1.配置buid.grade文件。在module的android下添加如下代码:
dataBinding{ enabled=true }
2.定义数据实体
package com.example.databinding.bean;/** * Created by h on 2016/9/8. */public class User{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
3.布局文件中声明实体,绑定控件
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="user" type="com.example.databinding.bean.User"/> </data> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}" /> </LinearLayout></layout>
4.java代码引用,填充实体
package com.example.databinding;import android.databinding.DataBindingUtil;import android.databinding.ViewDataBinding;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Toast;import com.example.databinding.bean.User;import com.example.databinding.bean.ViewModel;import com.example.databinding.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity { ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user=new User(); user.setName("huangxuanheng is very good"); binding.setUser(user); }}
上述代码运行后,效果如下图:![效果图1](http://img.blog.csdn.net/20160909110732918)小结:在布局文件中,根节点是layout,如果要绑定数据实体,则要在data节点下声明,data节点下的variable节点,就是用来声明所有引用的数据实体对象和类别的,其中name属性是声明对象实例,type属性声明对象类型,控件中要想引用data中声明的实体对象,可以通过@{对象.属性}引用,如上例中的TextView关于text属性的声明 android:text="@{user.name}"此时,如果实体对象的属性值发生了改变,界面会不会改变呢?答案是否定的,但实际工作中,我们往往有这样的需求:实体对象的属性改变了,界面也要跟着改变,此时,应该怎么做呢?android里面提供了一个非常好的一个类BaseObservable,只需要实体类基础了该类,并且在属性发生改变的时候,notify一下,获取属性的方法上标明注解 @Bindable,就可以通知到界面改变了,大致代码如下:
public class User extends BaseObservable { private String name; private int age; @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); } @Bindable public int getAge() { return age; } public void setAge(int age) { this.age = age; notifyPropertyChanged(BR.age); }}
BR不用理它是什么,个人认为相当于R文件中的R,自动生成的,意思是提醒界面改变对应的属性值android的数据绑定通知方面,感觉是有点复杂的,通过以上这种方式可以达到单向通知界面。在C#的开发过程中,我发现里面的数据绑定的定义非常简单方便,并且关于双向绑定的定义也是非常简单的,只需在xaml文件里面定义,就可以轻松的实现双向绑定了。so~!这方面还有待android进行优化开发中,往往涉及到点击事件,关于点击事件以往的做法,都是通过findViewById,然后再setOnClickListener实现的,现在有了databinding,关于findViewById的事,自然就不会再用了,那要怎么做呢?其实很简单,使用规则跟实体绑定类似的,只需在一个类里面编写一个点击的方法,然后在布局中data节点下,新增该类型的对象,在控件的onClick属性中调用该方法就可以了如: android:onClick="@{activity.onTxClick}",示例代码如下:布局:
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="user" type="com.example.databinding.bean.User"/> <variable name="activity" type="com.example.databinding.MainActivity"/> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_centerInParent="true" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="36sp" android:text="@{user.name}" android:onClick="@{activity.onTxClick}"/> </RelativeLayout></layout>
activity:
package com.example.databinding;import android.databinding.DataBindingUtil;import android.databinding.ViewDataBinding;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Toast;import com.example.databinding.bean.User;import com.example.databinding.bean.ViewModel;import com.example.databinding.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity { ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user=new User(); user.setName("huangxuanheng is very good"); binding.setUser(user); binding.setActivity(this); } public void onTxClick(View view){ Toast.makeText(this,"ni hao a ",Toast.LENGTH_SHORT).show(); User user = binding.getUser(); user.setName("huangxianheng you are a good man!"); }}
搞定,此时点击后,就可以看到弹出吐司了
以上就是我对android databinding的初步认识,采用了MVVM框架,可以很好的将业务和视图进行解耦。有了databinding,android技术上将更上一层楼,但目前还在不断的改进,API可能随时有改动,使用时切莫要谨慎了!
0 0
- 初步认识android databinding
- DataBinding 初步
- Android初步认识02
- android 的初步认识
- Android初步认识ToolBar
- Android Glide 初步认识
- android studio 初步认识
- android Templates初步认识
- Android RxJava初步认识
- android 重力感应初步认识
- Android之GridView初步认识
- Android的初步认识01
- 【Android安全】初步认识Drozer
- android进程的初步认识
- Android Material Design初步认识
- Android广播的初步认识
- Android MVP模式初步认识
- Android Databinding 从入门到转行(一)初步介绍
- 新增博客地址
- 启动图片和启动广告设置
- AndroidStudio多渠道打包心得
- Hibernate 一级缓存 二级缓存 1+N问题 查询缓存
- 死锁发生的条件
- 初步认识android databinding
- KMP字符串匹配
- Git 命令备忘录
- 汉明距离(Hamming distance)
- FreeCMS视频教程 图片水印设置
- 常见正则表达式
- 立体图形3D动画和绘制
- 【01】基础:集搜客爬虫软件安装
- 集群创建实例遇到的问题