自定义双向绑定框架-只需一个注解,简单实用

179 阅读2分钟

前言

本框架主要功能是实现了控件的双向绑定功能,只需要对控件加个注解即可,简化了配置,数据的改变能同步显示到界面,界面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));    }

MainActivityInjector为生成的java文件,命名规则为当前Activity的名字拼接上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版本也会补充,欢迎大神指点,轻点喷

原文链接:mp.weixin.qq.com/s/XPqs9JMPl…