常常听到这么一个口号,叫做“努力做个爱偷懒的程序猿”。显然,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外,其他事件的回调函数绑定也是如此,就不一一详细介绍了。配置完毕,给个例子,大家就懂了。

Android ButterKnife注入框架 使用_第1张图片 Android ButterKnife注入框架 使用_第2张图片

首先,来看看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()之后,一定不要忘记的是进行绑定注解

ButterKnife.bind(this); // 绑定注解

@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);        // TODO Use fields...        return view;    }}

顺便提一点,每个需要绑定注解的Activity都得执行ButterKnife.bind(this);如果怕忘了怎么办?写个BaseActivity,继承Activity,在BaseActivity的onCreate函数里面进行绑定,那么我们只要把自己写的Activity来继承BaseActivity就行了,当然,BaseActivity还可以实现其他一些通用的东西。

这里要强调的一点是,如果你使用AndroidStudio直接通过build.gradle添加 compile 'com.jakewharton:butterknife:6.1.0' 来引入ButterKnife的话,那么就会有一些变动了,如下:

Android ButterKnife注入框架 使用_第3张图片

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


更多相关文章

  1. Android单元测试框架 Robolectric
  2. Android 7.0 IMS框架详解
  3. 有关android 应用的plugin框架调研
  4. Android View框架总结(一)
  5. Android UI框架——QMUI Android 环境搭建(一)
  6. [转]Android的多媒体框架OpenCore(PacketVideo)介绍
  7. android轻量框架五__配置界面
  8. Android 网络通信框架Volley完全解析(一)
  9. Android -- 跨应用绑定service(AIDL)

随机推荐

  1. 狂刷Android范例之4:用代码安装卸载app
  2. android studio sdk更新 (2015-8-5)
  3. 谁说Android不行了,以个人能力的不行来否
  4. Android新手入门2016(6)--客户端编程思想的
  5. Bash脚本之多线程处理
  6. Android天下大乱,Google无法一统山河
  7. 小米手机十月份会有原生 Android 2.3.5
  8. [转载] 我的Android进阶之旅:经典的大牛博
  9. 自己用android做的一个简单的播放器
  10. 这里有一份BAT大厂Android面试超详细知识