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); } } }运行程序,搞定