前言
在日常的开发工作中,我们有的同学喜欢使用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();
}
}
}
附录:完整的技术方案代码
本文探讨了在Android开发中如何在DataBinding和ButterKnife两种框架间进行选择和切换,作者分享了自己的实战经验,包括启用DataBinding的配置以及ButterKnife的依赖设置,帮助开发者更灵活地自定义View开发。

1400

被折叠的 条评论
为什么被折叠?



