经常听到这么一个口号,叫作“努力作个爱偷懒的程序猿”。显然,Android ButterKnife也在必定程度上帮助了你成为一名偷懒的程序猿。做为Android开发者,你确定对findViewById(),setOnClickListener(),setOnClickListener()等等很是熟悉,长此以往,是否是厌烦了这些东西,简单没养分,又不得不写,这时候,诸如Android ButterKnife,AndroidAnnotations等开源框架就出现了。html
ButterKnife新特性:java
一、支持 Activity 中的 View 注入android
二、支持 View 中的 View 注入app
三、支持 View 事件回调函数注入(@OnLongClick @OnFocusChanged @OnItemClick @OnItemLongClick @OnCheckedChanged等等)框架
今天,咱们来说一下Android ButterKnife的使用,Android ButterKnife是一个专一于Android系统的View注入框架,能够减小至少一半的代码量。ide
首先第一步,确定是引用Library咯~函数
一、导入butterknife-7.0.1.jar,下载地址butterknife-7.0.1.jar布局
我使用的AndroidStudio开发,是若是你使用的是Eclipse,那么还须要进行下面的配置gradle
二、右击项目->属性->Java Compiler → Annotation Processing ,选中"Enable project specific settings".ui
三、展开Annotation Processing,点击Factory Path,选中Enable project specific settings,而后点击Add JARs…,选中libs下的Butter Knife jar包
除了onClick外,其余事件的回调函数绑定也是如此,就不一一详细介绍了。配置完毕,给个例子,你们就懂了。

首先,来看看xml布局文件,这里只是定义简单的几个Button控件
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <Button
- android:id="@+id/btn1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <Button
- android:id="@+id/btn2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <Button
- android:id="@+id/btn3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <Button
- android:id="@+id/btn4"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
在Activity中,进行注解的绑定。
- package com.newland.adsl;
-
- import android.support.design.widget.TextInputLayout;
- import android.support.v7.app.ActionBarActivity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
-
- import butterknife.Bind;
- import butterknife.ButterKnife;
- import butterknife.OnClick;
-
-
- public class MainActivity extends ActionBarActivity {
-
- @Bind(R.id.btn1)
- Button btnOne;
-
- @Bind(R.id.btn2)
- Button btnTwo;
-
- @Bind(R.id.btn3)
- Button btnThree;
-
- @Bind(R.id.btn4)
- Button btnFour;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- ButterKnife.bind(this); // 绑定注解
- btnOne.setText("按钮-1");
- btnTwo.setText("按钮-2");
- btnThree.setText("按钮-3");
- btnFour.setText("按钮-4");
- }
-
- @OnClick(R.id.btn1) // 不带参数
- public void btnOne() {
- Toast.makeText(MainActivity.this, "Toast comes out", Toast.LENGTH_SHORT).show();
- }
-
-
- @OnClick(R.id.btn2)// 带有Button参数
- public void btnTwo(Button button) {
- button.setText("Hello!");
- }
-
- @OnClick({R.id.btn3, R.id.btn4}) // 同时绑定多个控件
- public void btnThreeAndFour(Button button) {
- button.setText("World!");
- }
- }
在onCreate()里面,setContentView()以后,必定不要忘记的是进行绑定注解
@Bind(R.id.btn1) 这就把下面的变量名与控件id绑定了,就至关于执行了findViewById()
@OnClick(R.id.btn2) 这是绑定控件的点击事件,函数里面执行的就是点击事件触发后要作的事,至关于setOnClickListener(new OnClickListener( onClick( ... ... )));
以上就是实如今Activity下的绑定,固然,在ViewHolder模式下和Fragement也能够绑定。
ViewHolder模式下绑定:
- public class MyAdapter extends BaseAdapter {
- @Override
- public View getView(int position, View view, ViewGroup parent) {
- ViewHolder holder;
- if (view != null) {
- holder = (ViewHolder) view.getTag();
- } else {
- view = getLayoutInflater().inflate(R.layout.design_navigation_item, parent, false);
- holder = new ViewHolder(view);
- view.setTag(holder);
- }
- holder.name.setText("Inject");
- return view;
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public Object getItem(int position) {
- return null;
- }
-
- @Override
- public int getCount() {
- return 0;
- }
-
- class ViewHolder {
- @Bind(R.id.title)
- TextView name;
-
- public ViewHolder(View view) {
- ButterKnife.bind(this, view);
- }
- }
- }
Fragement下的绑定:
- public class MyFragment extends Fragment {
- @Bind(R.id.button1)
- Button button1;
- @Bind(R.id.button2)
- Button button2;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment, container, false);
- ButterKnife.bind(this, view);
-
- return view;
- }
- }
顺便提一点,每一个须要绑定注解的Activity都得执行ButterKnife.bind(this);若是怕忘了怎么办?写个BaseActivity,继承Activity,在BaseActivity的onCreate函数里面进行绑定,那么咱们只要把本身写的Activity来继承BaseActivity就好了,固然,BaseActivity还能够实现其余一些通用的东西。
这里要强调的一点是,若是你使用AndroidStudio直接经过build.gradle添加 compile 'com.jakewharton:butterknife:6.1.0' 来引入ButterKnife的话,那么就会有一些变更了,以下:

- @InjectView(R.id.hello)
- TextView hello;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ButterKnife.inject(this);
- }
这就是butterknife:6.1.0和butterknife-7.0.1.jar 由于版本不一样产生的区别。