完美支持DataBinding和ButterKnife两种框架切换方便自定义View开发

本文探讨了在Android开发中如何在DataBinding和ButterKnife两种框架间进行选择和切换,作者分享了自己的实战经验,包括启用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();
        }

    }


}

附录:完整的技术方案代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值