資料中介者--資料繫結2(data-binding)

LightSun發表於2017-11-22

關於資料中介者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;
  • 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的。
  • 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;複製程式碼
  • 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;複製程式碼

綜合示例

/**
 * 第二種方式: 繫結一組屬性到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。

感謝你的閱讀 !

技術源於分享!!!

相關文章