Android ButterKnife注入框架

学向勤中得,萤窗万卷书。这篇文章主要讲述Android ButterKnife注入框架相关的知识,希望能为你提供帮助。
常常听到这么一个口号,叫做“ 努力做个爱偷懒的程序猿” 。显然,Android  ButterKnife也在一定程度上帮助了你成为一名偷懒的程序猿。作为android开发者,你肯定对findViewById(),setOnClickListener(),setOnClickListener()等等非常熟悉,久而久之,是不是厌烦了这些东西,简单没营养,又不得不写,这时候,诸如Android ButterKnife,AndroidAnnotations等开源框架就出现了。
【Android ButterKnife注入框架】ButterKnife新特性:
      1、支持 Activity 中的 View 注入
      2、支持 View 中的 View 注入
      3、支持 View 事件回调函数注入(@OnLongClick  @OnFocusChanged @OnItemClick @OnItemLongClick @OnCheckedChanged等等)
 
今天,我们来讲一下Android ButterKnife的使用,Android ButterKnife是一个专注于Android系统的View注入框架,可以减少至少一半的代码量。
首先第一步,肯定是引用Library咯~
      1、导入butterknife-7.0.1.jar,下载地址butterknife-7.0.1.jar
        我使用的AndroidStudio开发,是如果你使用的是Eclipse,那么还需要进行下面的配置
      2、右击项目-> 属性-> Java  Compiler → Annotation Processing ,选中"Enable project specific settings".
      3、展开Annotation Processing,点击Factory Path,选中Enable project specific settings,然后点击Add JARs… ,选中libs下的Butter Knife jar包
除了onClick外,其他事件的回调函数绑定也是如此,就不一一详细介绍了。配置完毕,给个例子,大家就懂了。

Android ButterKnife注入框架

文章图片
     
Android ButterKnife注入框架

文章图片

首先,来看看xml布局文件,这里只是定义简单的几个Button控件
[html]  view plain  copy  
  1. < LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"   
  2.         xmlns:app="http://schemas.android.com/apk/res-auto"   
  3.         android:layout_width="match_parent"   
  4.         android:layout_height="match_parent"   
  5.         android:orientation="vertical">    
  6.    
  7.         < Button   
  8.                 android:id="@+id/btn1"   
  9.                 android:layout_width="wrap_content"   
  10.                 android:layout_height="wrap_content"  />    
  11.    
  12.         < Button   
  13.                 android:id="@+id/btn2"   
  14.                 android:layout_width="wrap_content"   
  15.                 android:layout_height="wrap_content"  />    
  16.    
  17.         < Button   
  18.                 android:id="@+id/btn3"   
  19.                 android:layout_width="wrap_content"   
  20.                 android:layout_height="wrap_content"  />    
  21.    
  22.         < Button   
  23.                 android:id="@+id/btn4"   
  24.                 android:layout_width="wrap_content"   
  25.                 android:layout_height="wrap_content"  />    
  26. < /LinearLayout>    
 
在Activity中,进行注解的绑定。
[html]  view plain  copy  
  1. package  com.newland.adsl;    
  2.    
  3. import  android.support.design.widget.TextInputLayout;    
  4. import  android.support.v7.app.ActionBarActivity;    
  5. import  android.os.Bundle;    
  6. import  android.view.View;    
  7. import  android.view.ViewGroup;    
  8. import  android.widget.BaseAdapter;    
  9. import  android.widget.Button;    
  10. import  android.widget.TextView;    
  11. import  android.widget.Toast;    
  12.    
  13. import  butterknife.Bind;    
  14. import  butterknife.ButterKnife;    
  15. import  butterknife.OnClick;    
  16.    
  17.    
  18. public  class  MainActivity  extends  ActionBarActivity  {   
  19.    
  20.         @Bind(R.id.btn1)   
  21.         Button  btnOne;    
  22.    
  23.         @Bind(R.id.btn2)   
  24.         Button  btnTwo;    
  25.    
  26.         @Bind(R.id.btn3)   
  27.         Button  btnThree;    
  28.    
  29.         @Bind(R.id.btn4)   
  30.         Button  btnFour;    
  31.    
  32.         @Override   
  33.         protected  void  onCreate(Bundle  savedInstanceState)  {   
  34.                 super.onCreate(savedInstanceState);    
  35.                 setContentView(R.layout.activity_main);    
  36.                 ButterKnife.bind(this);   //  绑定注解   
  37.                   btnOne.setText("按钮-1");    
  38.                 btnTwo.setText("按钮-2");    
  39.                 btnThree.setText("按钮-3");    
  40.                 btnFour.setText("按钮-4");    
  41.         }   
  42.    
  43.         @OnClick(R.id.btn1)  //  不带参数   
  44.         public  void  btnOne()  {   
  45.                 Toast.makeText(MainActivity.this,  "Toast  comes  out",  Toast.LENGTH_SHORT).show();    
  46.         }   
  47.    
  48.    
  49.         @OnClick(R.id.btn2)//  带有Button参数   
  50.         public  void  btnTwo(Button  button)  {   
  51.                 button.setText("Hello!");    
  52.         }   
  53.    
  54.         @OnClick({R.id.btn3,  R.id.btn4})  //  同时绑定多个控件   
  55.         public  void  btnThreeAndFour(Button  button)  {   
  56.                 button.setText("World!");    
  57.         }   
  58. }   
在onCreate()里面,setContentView()之后,一定不要忘记的是进行绑定注解
[java]  view plain  copy  
  1. ButterKnife.bind(this);   //  绑定注解   
@Bind(R.id.btn1) 这就把下面的变量名与控件id绑定了,就相当于执行了findViewById()
@OnClick(R.id.btn2) 这是绑定控件的点击事件,函数里面执行的就是点击事件触发后要做的事,相当于setOnClickListener(new OnClickListener( onClick( ... ... )));
以上就是实现在Activity下的绑定,当然,在ViewHolder模式下和Fragement也可以绑定。
ViewHolder模式下绑定:
[java]  view plain  copy  
  1. public  class  MyAdapter  extends  BaseAdapter  {   
  2.                 @Override   
  3.                 public  View  getView(int  position,  View  view,  ViewGroup  parent)  {   
  4.                         ViewHolder  holder;    
  5.                         if  (view  !=  null)  {   
  6.                                 holder  =  (ViewHolder)  view.getTag();    
  7.                         }  else  {   
  8.                                 view  =  getLayoutInflater().inflate(R.layout.design_navigation_item,  parent,  false);    
  9.                                 holder  =  new  ViewHolder(view);    
  10.                                 view.setTag(holder);    
  11.                         }   
  12.                         holder.name.setText("Inject");    
  13.                         return  view;    
  14.                 }   
  15.    
  16.                 @Override   
  17.                 public  long  getItemId(int  position)  {   
  18.                         return  position;    
  19.                 }   
  20.    
  21.                 @Override   
  22.                 public  Object  getItem(int  position)  {   
  23.                         return  null;    
  24.                 }   
  25.    
  26.                 @Override   
  27.                 public  int  getCount()  {   
  28.                         return  0;    
  29.                 }   
  30.    
  31.                 class  ViewHolder  {   
  32.                         @Bind(R.id.title)   
  33.                         TextView  name;    
  34.    
  35.                         public  ViewHolder(View  view)  {   
  36.                                 ButterKnife.bind(this,  view);    
  37.                         }   
  38.                 }   
  39.         }   

Fragement下的绑定:
[java]  view plain  copy  
  1. public  class  MyFragment  extends  Fragment  {   
  2.         @Bind(R.id.button1)   
  3.         Button  button1;    
  4.         @Bind(R.id.button2)   
  5.         Button  button2;    
  6.    
  7.         @Override   
  8.         public  View  onCreateView(LayoutInflater  inflater,  ViewGroup  container,  Bundle  savedInstanceState)  {   
  9.                 View  view  =  inflater.inflate(R.layout.fragment,  container,  false);    
  10.                 ButterKnife.bind(this,  view);    
  11.                 //  TODO  Use  fields...   
  12.                 return  view;    
  13.         }   
  14. }   
 
顺便提一点,每个需要绑定注解的Activity都得执行ButterKnife.bind(this); 如果怕忘了怎么办?写个BaseActivity,继承Activity,在BaseActivity的onCreate函数里面进行绑定,那么我们只要把自己写的Activity来继承BaseActivity就行了,当然,BaseActivity还可以实现其他一些通用的东西。
 
这里要强调的一点是,如果你使用AndroidStudio直接通过build.gradle添加 compile ‘com.jakewharton:butterknife:6.1.0‘ 来引入ButterKnife的话,那么就会有一些变动了,如下:
Android ButterKnife注入框架

文章图片

[java]  view plain  copy  
  1. @InjectView(R.id.hello)   
  2. TextView  hello;    
  3. @Override   
  4. protected  void  onCreate(Bundle  savedInstanceState)  {   
  5.         super.onCreate(savedInstanceState);    
  6.         ButterKnife.inject(this);    
  7. }   
这就是butterknife:6.1.0和butterknife-7.0.1.jar 因为版本不同产生的区别。

    推荐阅读