前言
在日常的開發工作中,我們有的同學喜歡使用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();
}
}
}
附錄:完整的技術方案代碼