ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤,而且使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单
话不多说,先简单说一下怎么配置ButterKnife
现在项目的build.gradle里面导入环境
然后在app里面的build.gradle-dependencies导入这两行(可以更高版本)
implementation 'com.jakewharton:butterknife:8.0.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.0.1'
之后sync一下就可以使用ButterKnife了
使用ButterKnife很简单,可以不用去findViewById了
要注意的是:使用了ButterKnife之后,控件前面不能使用private,否则会报错;
然后记得在onCreate的时候去绑定一下,这样就搞定了
如果想设置点击事件的话
//添加注解
@OnClick({R.id.btn_1})
public void OnClick(View view){
switch (view.getId ()){
case R.id.btn_1:
mButton_1.setText ("Button1");
mButton_2.setText ("Button");
mTextView.setText ("ButterKnife");
break;
}
}
然后运行,搞定;
接下来看看怎么结合ListView来使用
首先结合ListView的话我们先创建一个子item
category_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="56dp">
<TextView
android:id="@+id/id_title"
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
创建一个新的CategoryActivity
package com.example.butter_knife;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnItemClick;
public class Category extends AppCompatActivity {
//注入ListView
@BindView (R.id.listt_View)
ListView listView;
//初始化数据
private List<String> mData = new ArrayList<> (Arrays.asList ("Simple use" , "ListView"));
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_categroy);
ButterKnife.bind (this);
//设置适配器
listView.setAdapter (new CategoryAdapter (this,mData));
}
@OnItemClick(R.id.listt_View)
public void itemClicked(int position){
//土司
Toast.makeText (this,"position: " + position,Toast.LENGTH_SHORT).show ();
}
}
布局文件就一个ListView
ListView有了,那我们就需要一个适配器
Adapter的话我们还是用ViewHolder来做缓存
package com.example.butter_knife;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class CategoryAdapter extends ArrayAdapter<String> {
private LayoutInflater inflater;
public CategoryAdapter(Context context, List<String> objects){
super (context,-1,objects);
inflater = LayoutInflater.from (context);
}
@Override
public View getView(int position,View convertView,ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null){
convertView = inflater.inflate (R.layout.categroy_item,parent,false);
viewHolder = new ViewHolder (convertView);
convertView.setTag (viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag ();
}
viewHolder.mTextView.setText (getItem (position));
return convertView;
}
static class ViewHolder{
//注入textView
@BindView (R.id.id_title)
TextView mTextView;
public ViewHolder(View view){
//因为ViewHolder没有findViewById这个方法,所以只传入this是不可以的
//这个view就相当于是convertView
ButterKnife.bind (this,view);
}
}
}
运行程序,搞定