前言
本框架主要功能是实现了控件的双向绑定功能,只需要对控件加个注解即可,简化了配置,数据的改变能同步显示到界面,界面UI数据的变化能同步到数据模型里。
技术要点介绍
本框架用的技术有:
1、注解,BindView、OnClick
2、注解处理器annotationProcessor,点击查看详细讲解
3、javapoet生成文件,根据注解生成java文件,代码生成了findViewById 、事件监听、数据模型的监听以及界面UI的变化等。点击查看详细使用讲解
4、AppCompatDelegate 对TextView、EditText做了全局替换。本方案可以用ASM插桩替换实现,逼格更高一点。
5、性能消耗忽略不计,框架上的一些代码性能逻辑开销在编译时已经处理过了,所以在运行时消耗基本忽略不计。
使用说明
1、初始化:
protected void onCreate(Bundle savedInstanceState) {
//本句代码在super.onCreate(savedInstanceState)之前
((MainActivity$$Injector)BindWay.getInstance().getInjector(this)).init(this);
super.onCreate(savedInstanceState);
setContentView(vdb.getRoot());
//本句代码在setContentView之后
injector = ((MainActivity$$Injector) BindWay.getInstance().bind(this));
}
MainActivity$$Injector为生成的java文件,命名规则为当前Activity的名字拼接上$$Injector字符串
2、使用注解
@BindView(value = R.id.metlis, key = "dataet")
EditText metlis;
@BindView(value = R.id.mtvlis, key = "dataTv")
TextView mtvlis;
@BindView(value = R.id.mview, key = "dataView")
MView mview;
@BindView(value = R.id.mrg, key = "rbValue")
RadioGroup mrg;
value是控件的id,key是数据对应的字段名
基础控件只对TextView、EditText、RadioGroup做了支持,自定义的继承了TextView、EditText、RadioGroup这3个的组件也支持,其他的组件可自行补充。
对于自定义的控件如MView,只支持内部布局为xml格式的,不支持代码生成的 如new TextView(content),因为AppCompatDelegate 只能对xml布局里的控件进行替换。
自定义的控件需要对内部的TextView或者EditText加上tag,tag的格式为:"BTag:"+ BindView对应的key值,用于标记监听的控件。
如:android:tag="BTag:dataView"
3、设置数据
injector.setData(key, value);
如:
injector.setData("dataView", "123");
4、获取数据
返回key对应的数据
injector.getData(key)
返回整个数据结构Map
injector.getData()
总结
在用vue开发APP的时候觉得vue的双向绑定太爽了,就看了下Vue2和vue3 的源码,想自己实现一个类似的框架。
google官方出品的DataBinding,实在是太难用,所以忙里偷闲大概花了3天左右的时间,终于把由来已久的想法实现了,初始化之后只需一个注解即可实现双向绑定,自己用了下 简直不要太好用,有时间后续其他控件也会逐渐补充,kotlin版本也会补充,欢迎大神指点,轻点喷。
关注我获取更多知识或者投稿