完美支持DataBinding和ButterKnife兩種框架切換方便自定義View開發

前言

在日常的開發工作中,我們有的同學喜歡使用ButterKnife有的則熱衷於DataBinding框架對於兩種框架來說,各有千秋。今天的內容主要是根據我的自身實踐經驗,分享給大家!

依賴

啓用DataBinding插件:
dataBinding {
enabled = true
}

butterknife依賴:
project.build文件
classpath ‘com.jakewharton:butterknife-gradle-plugin:10.2.1’

app.build文件
api ‘com.android.support:support-annotations:28.0.0’
implementation ‘com.jakewharton:butterknife:10.2.1’
annotationProcessor ‘com.jakewharton:butterknife-compiler:10.2.1’

IViewBinder .java

public interface IViewBinder {


    /**
     * 默認方法,用來初始化佈局綁定方式
     * @param layoutId
     * @param context
     * @param target
     */
    default void init(@LayoutRes int layoutId, Context context, ViewGroup target) {
        Object object = null;
        if (layoutId == 0) {
            throw new IllegalArgumentException("請選擇佈局文件");
        }
        boolean useDataBinding = userDataBinding();
        try{
            if (useDataBinding) {
                object = DataBindingUtil.inflate(LayoutInflater.from(context), layoutId, target, true);
            } else {
                View view = LayoutInflater.from(context).inflate(layoutId, target, true);
                object = KnifeKit.bind(this, view);
            }

        }catch (Exception e){
            e.printStackTrace();
        }

        if(object==null){
            return;
        }
        initObject(object);
        initData();


    }

    /**
     * 是否使用Databinding
     * @return
     */
    boolean userDataBinding();

    /**
     * 根據userDataBinding來判斷返回對象是
     * @param object
     */
    void initObject(Object object);

    /**
     * 做一些初始化操作
     */
    void initData();

    /**
     * 自定義View佈局ID
     * @return
     */
    int getLayoutId();



}

AbstractLinearLayout.java

public abstract class AbstractLinearLayout extends LinearLayout implements IViewBinder {

    private Unbinder unbinder;
    protected ViewDataBinding viewDataBinding;

    public AbstractLinearLayout(Context context) {
        super(context);
        init(getLayoutId(),context,this);
    }


    public AbstractLinearLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(getLayoutId(),context,this);
    }

    public AbstractLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(getLayoutId(),context,this);
    }

    public AbstractLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(getLayoutId(),context,this);
    }

    @Override
    public void initObject(Object object) {

        if(userDataBinding()){
            viewDataBinding= (ViewDataBinding) object;
        }else{
            unbinder= (Unbinder) object;
        }
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        unbinder = null;
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (unbinder != null)
            unbinder.unbind();
        if(viewDataBinding!=null){
            viewDataBinding.unbind();
        }

    }
}

AbstractRelativeLayout .java

public abstract class AbstractRelativeLayout extends RelativeLayout implements IViewBinder {
    private Unbinder unbinder;
    protected ViewDataBinding viewDataBinding;
    public AbstractRelativeLayout(Context context) {
        super(context);
        init(getLayoutId(),context,this);
    }

    public AbstractRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(getLayoutId(),context,this);
    }

    public AbstractRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(getLayoutId(),context,this);
    }

    public AbstractRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(getLayoutId(),context,this);
    }


    @Override
    public boolean userDataBinding() {
        return false;
    }

    @Override
    public void initObject(Object object) {
        if(userDataBinding()){
            viewDataBinding= (ViewDataBinding) object;
        }else{
            unbinder= (Unbinder) object;
        }
    }

    @Override
    public void initData() {

    }
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        unbinder = null;
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (unbinder != null)
            unbinder.unbind();
        if(viewDataBinding!=null){
            viewDataBinding.unbind();
        }

    }


}

附錄:完整的技術方案代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章