Android ButterKnife注入框架

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android ButterKnife注入框架相关的知识,希望对你有一定的参考价值。

常常听到这么一个口号,叫做“努力做个爱偷懒的程序猿”。显然,Android ButterKnife也在一定程度上帮助了你成为一名偷懒的程序猿。作为android开发者,你肯定对findViewById(),setOnClickListener(),setOnClickListener()等等非常熟悉,久而久之,是不是厌烦了这些东西,简单没营养,又不得不写,这时候,诸如Android ButterKnife,AndroidAnnotations等开源框架就出现了。

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外,其他事件的回调函数绑定也是如此,就不一一详细介绍了。配置完毕,给个例子,大家就懂了。

技术分享   技术分享

首先,来看看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的话,那么就会有一些变动了,如下:

技术分享

[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 因为版本不同产生的区别。

以上是关于Android ButterKnife注入框架的主要内容,如果未能解决你的问题,请参考以下文章

Android ButterKnife注入框架

Android ButterKnife依赖注入框架的引入和使用

ButterKnife--View注入框架

Android进阶之光学习记录——注解与依赖注入框架ButterKnife的尝试

Android进阶之光学习记录——注解与依赖注入框架ButterKnife的尝试

Android进阶之光学习记录——注解与依赖注入框架ButterKnife的尝试