關於資料中介者Data-mediator
- 資料中介者設計之初主要是為了減少資料層的變化,以及適應其他的業務需求。 後面才有了更加強大的功能.
這就不做其他介紹了。 有興趣的可以看看我之前的文章或者直接看github/Data-Mediator, 裡面有中文文件
闡述:DataMediator之data-binding.
- 關於android資料繫結,相信最開始大家是從google Data-binding庫開始瞭解的。 當然有部分童鞋是從javaweb轉的,javaweb也有對應的資料繫結思想。
- 資料繫結的好處: 一次繫結,以後所有的對對應資料的操作可以直接或者說間接的反饋到檢視view上。這樣就會減輕技術人員
對view操作的負擔。 - DataMediator的優勢: 由於butterknife的工作是負責id等資源的繫結,DataMediator之Data-binding負責對資料的繫結。
兩者工作完全不衝突,而且可以無縫銜接在一起。 所以加起來就是2個字--強大. 最主要的就是倆者的部分工作原理都是類似的.
都是利用編譯時註解去生成程式碼然後繫結到目標上。實際上dagger/dagger2, google的資料庫元件也是類似的。
另外的此框架還針對adapter的資料繫結做了支援。
(關於不懂ButterKnife的童鞋,需要自行去github/Butterknife瞭解並熟悉運用。)
適用範圍
- 資料中介者可以用於常用的控制元件,view/TextView/ImageView等。甚至連自定義控制元件任意方法都支援.
資料繫結相關注解介紹
- 屬性物件改變: 屬性物件指的是某個屬性屬於資料模型的,對應的這個屬性的資料物件。
- 1, View的註解
- @BindBackground
用於繫結View的背景。並且屬性物件是Drawable型別的. 示例:@BindBackground("background") TextView title;複製程式碼
- @BindBackgroundColor
用於繫結View的背景顏色。並且屬性物件是color型別的. 示例:@BindBackgroundColor("backgroundColor") TextView title;複製程式碼
- @BindBackgroundRes
用於繫結View的背景資源。並且屬性物件是資源型別的. 示例:@BindBackgroundRes("backgroundRes") TextView title;複製程式碼
- @BindVisibility
用於繫結view的可見性. 並且屬性物件是int或者boolean型別(取決於forceAsBoolean的返回值)的.@BindVisibility("visible") TextView title;複製程式碼
- @BindEnable
用於繫結控制元件是否啟用. 並且屬性物件是boolean型別的.java @BindEnable("enable") TextView tv;
- @BindBackground
- 2, TextView註解
- @BindTextColor 繫結文字顏色.
@BindTextColor("textColor") TextView title;複製程式碼
- @BindTextColorRes 繫結文字顏色資源
@BindTextColorRes("textColorRes") TextView title;複製程式碼
- @BindTextSize 繫結文字大小(預設dp為單位)
@BindTextSize("textSize") TextView title;複製程式碼
- @BindTextSizePx 繫結文字大小(以pix為單位)
@BindTextSizePx("textSizePx") TextView title;複製程式碼
- @BindTextSizeRes 繫結文字大小資源
@BindTextSizeRes("textSizeRes") TextView title;複製程式碼
- @BindTextGravity 繫結文字重心
@BindTextGravity("textGravity") TextView title;複製程式碼
- @BindText 繫結文字
@BindText("text") TextView title;複製程式碼
- @BindTextRes 繫結文字資源
@BindTextRes("textRes") TextView title;複製程式碼
- 其他的TextView註解.比如@BindHintText, @BindHintTextColor, @BindHintTextColorRes, @BindHintTextRes 都是針對hint的。
- @BindTextColor 繫結文字顏色.
3, ImageView註解介紹。
- @BindImageUrl 繫結圖片url地址
@BindImageUrl("url") ImageView iv;複製程式碼
- @BindImageRes 繫結圖片資源
@BindImageRes("imageRes") ImageView iv;複製程式碼
- @BindImageBitmap 繫結圖片之bitmap
@BindImageBitmap("imageBitmap") ImageView iv;複製程式碼
- @BindImageDrawable 繫結圖片之drawable
@BindImageDrawable("imageDrawable") ImageView iv;複製程式碼
- @BindImageUrl 繫結圖片url地址
4,繫結一組屬性或任意屬性
- @BindsView 繫結一組View屬性, 比如 'backgroundRes'. 'visibility'. 'enable'。
@BindsView( {"backgroundRes", "visibility", "enable"})複製程式碼
- @BindsTextView 繫結一組TextView屬性。比如'textColorRes'. 'textSizeRes'. 'textRes'
@BindsTextView( {"textColorRes", "textSizeRes", "textRes"}) TextView mTv;複製程式碼
- @BindsAny 用於繫結任意的一組屬性。(value陣列是屬性名稱,methods陣列是Binder的方法名稱,由於Binder可以自定義,所以可以繫結任意的控制元件到任意的方法 )
@BindsAny(value = {"prop1", "prop2"}, methods = {"bindAddText1", "bindAddText2"}) TextView mTv_supplier;複製程式碼
- @BindAny 用於繫結任意的一個屬性,(value是屬性名稱,method是Binder的方法名稱,由於Binder可以自定義,所以可以繫結任意的控制元件到任意的方法 )
@BindAny(value = "text", method = "bindAppendText") TextView mTv_supplier;複製程式碼
- @BindsView 繫結一組View屬性, 比如 'backgroundRes'. 'visibility'. 'enable'。
綜合示例
/**
* 第二種方式: 繫結一組屬性到view
* Created by heaven7 on 2017/11/13 0013.
*/
@BindMethodSupplierClass(BindMethodSupplier.DefaultBindMethodSupplier2.class)
public class TestBindArrayPropertyToOneView2 extends BaseActivity {
//bind array properties to a TextView.
//relative to @BindsTextView , @BindsAny has greater freedom(翻譯: BindsAny註解有更大的自由度).
// but it must use with @BindMethodSupplierClass.(翻譯: 但是他必須搭配註解BindMethodSupplierClass.)
@BindView(R.id.tv)
@BindsAny(value = {"textSizeRes", "textRes"}, //any count you want
methods = {"bindTextSizeRes", "bindTextRes"})
@BindAny(value = "textColorRes", method = "bindTextColorRes") //only one property
TextView mTv;
private ResHelper mHelper = new ResHelper();
private Binder<TextViewBind> mBinder;
@Override
protected int getLayoutId() {
return R.layout.ac_bind_array_prop_to_view;
}
@Override
protected void onInit(Context context, Bundle savedInstanceState) {
mHelper.init(context);
TextViewBind data = DataMediatorFactory.createData(TextViewBind.class);
mBinder = DataMediatorFactory.createDataBinding(this)
.bind(data, 0, PropertyInterceptor.NULL);
}
@OnClick(R.id.bt_text_color)
public void onClickChangeTextColorRes(View v) {
mBinder.getDataProxy().setTextColorRes(mHelper.toggleTextColorRes());
}
@OnClick(R.id.bt_text_size)
public void onClickChangeTextSizeRes(View v) {
mBinder.getDataProxy().setTextSizeRes(mHelper.toggleTextSizeRes());
}
@OnClick(R.id.bt_text)
public void onClickChangeTextRes(View v) {
mBinder.getDataProxy().setTextRes(mHelper.toggleTextRes());
}
}複製程式碼
更多的demo請到github/Data-Mediator下載
或者看我之前的資料中介者:DataMediator, (ButterKnife最佳拍檔)
FAQ
如果你有任何的問題可以在github上提issue或者加入qq群(389960698)諮詢。
同時歡迎star/fock/contribute。
感謝你的閱讀 !
技術源於分享!!!