Android_Butterknife的使用详解

2017-01-14 15:49:00来源:http://www.jianshu.com/p/fa0a03bfbf6e作者:_hm人点击

第七城市


Butterknife-8.2.1
前言

在实际的Android开发过程中,我们往往会写大量的Layout,形形色色的View,然后再通过findViewById找到该View,最后再设置各种各样的监听,简单而重复的东西做多了,不仅会影响开发者的兴致更会直接影响开发效率。对于这种情况,我们可以采用注解的方式来开发,而ButterKnife就是采用注解方式开发的开源框架,该框架成熟优秀非常适合集成至项目中,用一句简单的话来概括就是:它可以很强大的快速绑定各种View和设置各种监听,提升开发效率且运行时不影响APP效率。下面就目前最新的Butterknife-8.2.1从如何集成到怎样使用这两个方面浅谈一下。


集成Butterknife

1.集成的方法有很多种,最简单的是从AS下载直接集成



集成Butterknife

在File->ProjectStructure->dependencies搜索Butterknife,点击下载


2.1配置Annotation Processing Tool(android-apt)



Project查看模式下:gradle->build.gradle

首先要配置Project查看模式下:gradle->build.gradle文件,Annotation Processing Tool版本最少也要1.0以上,因为Butterknife框架是使用apt技术,所以没配置该文件会直接导致编译不通过


2.2添加依赖关系



Project查看模式下:app->build.gradle

添加依赖关系:
compile 'com.jakewharton:butterknife:8.2.1'
apt 'com.jakewharton:butterknife-compiler:8.2.1'



顶部添加:apply plugin: 'android-apt'

最后不要忘记在顶部添加:apply plugin: 'android-apt',否则编译不通过


至此Butterknife-8.2.1已经集成完毕,接下来是如何使用


Butterknife的简单使用
@BindView(R.id.tv_test1)
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);//绑定
mTextView.setText("test");//这样就可以直接使用该TextView
}

最常用的是BindView,不再使用findViewById然后再强制转换


@OnClick({R.id.tv_test1, R.id.tv_test2, R.id.tv_test3})
void butterknifeOnItemClick(View view) {
switch (view.getId()) {
case R.id.tv_test1:
Log.e("hm","tv_test1");;
break;
case R.id.tv_show:
Log.e("hm","tv_test3");;
break;
case R.id.tv_hide:
Log.e("hm","tv_test3");;
break;
}
}

可批量设置View的点击监听事件,比起原生的写法省了不少劲


@BindView(R.id.in_includeView)
View mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
TextView textView = ButterKnife.findById(mView, R.id.tv_data);
textView.setText("这是从引入的View里面的找到的TextView ");
}

include layout可通过View找到里面的子View


@BindView(R.id.lv_data)ListView mListView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container, Bundle savedInstanceState) {
ButterKnife.bind(getActivity());
return inflater.inflate(R.layout.fragment_layout, container, false);
}

在fragment上的使用方法跟Activity基本一致


@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView=LayoutInflater.from(activity).inflate(R.layout.item_layout, null);
//通过ButterKnife找到该view
viewHolder.textView = ButterKnife.findById(convertView, R.id.lv_data);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(data.get(position).toString());
return convertView;
}
static class ViewHolder {
TextView textView;
}

对于Adapter可以简化传统的getview方法,使其简洁化


说到getview方法,这里穿插介绍一个我常用Viewholde工具类,它能使你的getview方法更加的简洁,先看工具类


//viewholder工具类
public class ViewHoldeUtils {
@SuppressWarnings("unchecked")
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
}

再看ViewHoldeUtils的使用方法,从这点上看比ButterKnife更加简洁明了,所以我个人更加推荐使用该工具类写getview方法


@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(activity).inflate( R.layout.item_layout, null);
}
TextView textView = ViewHoldeUtils.get(convertView,R.id.lv_data);
textView.setText(data.get(position).toString());
return convertView;
}

回到ButterKnife的话题,诸如此类的还有各种注入监听,例如listview的item监听等等...


@OnItemClick(R.id.lv_data)
void onItemClick(int position) {
Log.e("hm", "点击了" + position);
}

当然还有更多的注解这里就不一一介绍了,慢慢地去发现也是挺好的一件事儿



Butterknife的更多注解

总结

Butterknife的优点就不用多说了,总的来说就是两字"偷懒",让你把更多精力放在有用的方面上。在这里我想浅谈一下它的原理-->Annotation。注解大体上主要分为两种,一种是编译时注解,其最大的优点是对APP造成效率上的损耗很小,Butterknife框架就是采用这种注解方式,还有一种就是运行时的注解,本质就是利用java的反射机制,对于Android开发来讲一定程度上会对运行效率造成损耗,所以很多的开源注解框架都是采用前者的方式。


Annotation是个另外一个专题,这里就不深入的介绍啦,有需要就以后再说,Ok,希望我的文章对你有帮助,欢迎交流和讨论,




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台