ButterKnife使用

【参考链接】

AndroidButterknife 8.4.0 使用方法总结

http://www.cnblogs.com/zhaoyanjun/p/6016341.html

AndroidStudio上方便使用butterknife注解框架的偷懒插件Android ButterknifeZelezny

http://www.cnblogs.com/soaringEveryday/p/4607438.html?utm_source=tuicool&utm_medium=referral

 

ButterKnife出自大神JakeWharton之手,项目地址在

https://github.com/JakeWharton/butterknife  http://jakewharton.github.io/butterknife/

是一个依赖注入框架,用于简化androidfindViewByIdsetOnclickListener等的模板代码。

 

如何使用呢?新建一个工程,先来集成ButterKnife

module appbuild.gradle中添加依赖

dependencies {
    compile
'com.jakewharton:butterknife:8.4.0'

 

ButterKnife借助于APT,所以我们还需要添加APT

在工程根目录的build.gradle中添加android-aptclasspath

dependencies {
    classpath
'com.android.tools.build:gradle:2.3.3'
   
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

 

app modulebuild.gradle

apply plugin: 'android-apt'

 

dependencies {
    compile
'com.jakewharton:butterknife:8.4.0'
   
apt 'com.jakewharton:butterknife-compiler:8.4.0'

 

然后就可以在代码中使用ButterKnife了,

需要先给元素添加注解,然后在ActivityonCreate()中在setContentView()之后使用ButterKnife.bind()进行绑定,如下所示

@Override
protected void onCreate(BundlesavedInstanceState) {
   
super.onCreate(savedInstanceState);
   
setContentView(R.layout.activity_main);
   
ButterKnife.bind(this);

 

ButterKnife支持绑定的元素主要分为3类:

1、 绑定View

比如说在布局中定义的一个TextView,其idR.id.tv

<TextView
   
android:id="@+id/tv"
   
android:layout_width="wrap_content"
   
android:layout_height="wrap_content"
   
android:text="Hello" />

.java中可以通过@BindView注解进行绑定和使用(此时TextView的修饰符不能为private

@BindView(R.id.tv)
public TextView tv;

 

@Override
protected void onCreate(BundlesavedInstanceState) {
   
super.onCreate(savedInstanceState);
   
setContentView(R.layout.activity_main);
   
ButterKnife.bind(this);
   
tv.setText("World");

相当于省略了()findViewById()

 

2、 绑定Event

比如说在布局文件中定义了一个Button,其idR.id.btn

<Button
   
android:id="@+id/btn"
   
android:layout_width="match_parent"
   
android:layout_height="wrap_content"
   
android:text="Button"/>

在.java中可以使用@OnClick注解为该ButtononClick事件绑定方法

@OnClick(R.id.btn)
public void onClick(View view){
    Toast.makeText(
this, "toast frombind", Toast.LENGTH_LONG).show();
}

并且还可以同时为多个ViewonClick事件绑定到同一个方法

@OnClick({R.id.btn, R.id.tv})

相当于省略了()findViewById()setOnClickListener()

 

支持的事件包括

@OnClickView

@OnLongClickView

@OnTouchView

@OnFocusChangeView

@OnTextChangedEditText

@OnItemSelectedListView

@OnPageChangeViewPager

 

3、 绑定Resource

比如说在资源文件中定义了如下String,其idapp_name

<resources>
    <string
name="app_name">ButterKnifeDemo</string>
</resources>

在.java中可以使用@BindString注解进行绑定

@BindString(R.string.app_name)
public String strAppName;

 

@Override
protected void onCreate(BundlesavedInstanceState) {
   
super.onCreate(savedInstanceState);
   
setContentView(R.layout.activity_main);
   
ButterKnife.bind(this);
   
Toast.makeText(this, strAppName, Toast.LENGTH_LONG).show();
}

相当于省略了getResource().getString()方法。

 

支持的资源类型包括

@BindString(R.string.title)String title;

@BindBool(R.bool.is_tablet)boolean isTablet;

@BindDrawable(R.drawable.graphic)Drawable graphic;

@BindColor(R.color.red)int red; // int or ColorStateList field

@BindDimen(R.dimen.spacer)Float spacer; // int (for pixel size) or float (for exact value) field

@BindArray(R.array.countries) 

 

除了可以在Activity中使用,还可以在FragmentViewHolder中使用,如下所示

public class FancyFragment extends Fragment {

  @BindView(R.id.button1) Button button1;

  @BindView(R.id.button2) Button button2;

 

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fancy_fragment, container, false);

    ButterKnife.bind(this, view);

    // TODO Use fields...

    return view;

  }

}

 

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 = inflater.inflate(R.layout.whatever, parent, false);

      holder = new ViewHolder(view);

      view.setTag(holder);

    }

 

    holder.name.setText("John Doe");

    // etc...

 

    return view;

  }

 

  static class ViewHolder {

    @BindView(R.id.title) TextView name;

    @BindView(R.id.job_title) TextView jobTitle;

 

    public ViewHolder(View view) {

      ButterKnife.bind(this, view);

    }

  }

}

 

等等,觉得写太多@很麻烦?在Android Studio中可以借助zelezny插件自动生成注解和变量声明

按照如下步骤来安装插件,完成以后重启Android Studio

ButterKnife使用

新建一个Activity类,重写其onCreate()方法并调用setContentView(R.layout.activity_main),然后将光标放置到R.layout.activity_main处右键,选择Generate依次如下点击,即可自动生成

ButterKnife使用

ButterKnife使用

ButterKnife使用

ButterKnife使用