自定義雙向繫結框架-只需一個註解,簡單實用

語言: CN / TW / HK

前言

本框架主要功能是實現了控制元件的雙向繫結功能,只需要對控制元件加個註解即可,簡化了配置,資料的改變能同步顯示到介面,介面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版本也會補充,歡迎大神指點,輕點噴。

關注我獲取更多知識或者投稿