ButterKnife入门教程

2018-07-13  本文已影响0人  linzhiyong

版权所有,转载请注明出处:linzhiyong https://www.jianshu.com/p/b1fc5b0e9e87 https://blog.csdn.net/u012527802/article/details/81059568

目录

1 ButterKnife
2 ButterKnife是什么,看一下Github上作者JakeWharton大神的介绍
3 AndroidStudio集成ButterKnife插件和依赖
3.1 插件集成
3.2 添加依赖
4 开始使用
4.1 13种绑定注解说明
4.2 事件注解说明
4.3 在Activity中使用
4.4 在Fragment中使用
4.5 在ViewHolder中使用
4.6 绑定View
4.6.1 手动绑定
4.6.2 快捷键(插件)绑定
4.7 绑定Drabable、Anim、Bitmap、String、Array、Dimen、Color
4.8 绑定事件(点击、选择、长按、触摸等等事件)

1. ButterKnife

ButterKnife是一个轻量级的注解框架,作用于Android视图的字段和方法、资源的绑定。本文只做一些基本的举例,让没接触过ButterKnife的同学可以简单粗暴的上手。
Github:https://github.com/JakeWharton/butterknife
ButterKnifeDemo传送门:https://github.com/linzhiyong/ButterKnifeDemo

2. ButterKnife是什么,看一下Github上作者JakeWharton大神的介绍

Field and method binding for Android views which uses annotation processing to generate boilerplate code for you.

  1. Eliminate findViewById calls by using @BindView on fields.
  2. Group multiple views in a list or array. Operate on all of them at once with actions, setters, or properties.
  3. Eliminate anonymous inner-classes for listeners by annotating methods with @OnClick and others.
  4. Eliminate resource lookups by using resource annotations on fields.

Android视图的字段和方法绑定,使用注释处理生成样板代码。

  1. 在字段上使用@BindView消除findViewById调用。
  2. 将列表或数组中的多个视图分组。 使用操作,设置器或属性一次操作所有这些操作。
  3. 通过使用@OnClick和其他方法注释方法来消除侦听器的匿名内部类。
  4. 通过在字段上使用资源注释来消除资源查找。

3. AndroidStudio集成ButterKnife插件和依赖

3.1 插件集成

AndroidStudio -> File -> Settings -> Plugins -> Browse repositories -> 搜索ButterKnife,找到Android ButterKnife Zeleany点击Install,重启AndroidStudio 。


插件集成图解

3.2 添加依赖

在build.gradle文件中添加:

dependencies {
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

如果是在Library中使用ButterKnife,则需要在项目根目录下的build.gradle中添加:

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
  }
}

同时修改Libirary下的build.gradle

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

4 开始使用

4.1 13种绑定注解说明

注解名称 注解说明
@BindView 绑定一个view,@BindView(R.id.listView1) ListView listView;
@BindViews 绑定多个view,@BindViews({R.id.textView1, R.id.textView2}) List<TextView> viewList
@BindAnim 绑定一个动画资源,@BindAnim(R.anim.anim_translate_1) Animation animation
@BindArray 绑定res/string.xml下的array数组,@BindArray(R.array.list) String[] array
@BindBitmap 绑定图片资源为Bitmap,@BindBitmap( R.mipmap.ic_launcher ) Bitmap iconBitmap
@BindBool 绑定boolean
@BindColor 绑定color,@BindColor(R.color.colorAccent) int colorAccent
@BindDimen 绑定Dimen,@BindDimen(R.dimen.width) int width
@BindDrawable 绑定Drawable@BindDrawable(R.drawable.ic_launcher_background) Drawable drawable
@BindFloat 绑定float
@BindFont 绑定font
@BindInt 绑定int
@BindString 绑定一个String,@BindString( R.string.app_name ) String appName

4.2 事件注解说明

注解名称 注解说明
@OnCheckedChanged CheckBox 选中、取消选中事件绑定
@OnClick view点击事件
@OnEditorAction 软键盘的功能键
@OnFocusChange EditText等 焦点改变事件
@OnItemClick ListView、GridView等组件item点击事件
@OnItemLongClick ListView、GridView等组件item长按事件,返回类型boolean型,返回true可以拦截onItemClick
@OnItemSelected Spinner item选择事件
@OnLongClick view 长按事件
@OnPageChange ViewPager 页面改变事件
@OnTextChanged EditText 文本变化事件
@OnTouch view 触摸事件
@Optional 可选绑定,默认情况下,@bind和监听器绑定都必须有一个目标view,当butter knife找不到对应的view时会抛出一个异常。为了防止这种异常情况的发生,可以在绑定的字段前面使用@Nullable注解,在绑定的方法前面则可使用@Option注解,来表明对应的是一个可选绑定。

4.3 在Activity中使用

private Unbinder unbinder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    unbinder = ButterKnife.bind(this); // 返回一个Unbinder对象
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (unbinder != null) {
        unbinder.unbind();
    }
}

4.4 在Fragment中使用

public class HomeFragment extends Fragment {

    private Unbinder unbinder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_main, container, false);
        unbinder = ButterKnife.bind(this, view);
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (unbinder != null) {
            unbinder.unbind();
        }
    }
}

4.5 在ViewHolder中使用

final class ViewHolder {

    @BindView(R.id.nameView)
    TextView nameView;

    @BindView(R.id.ageView)
    TextView ageView;

    ViewHolder(View view) {
        ButterKnife.bind(this, view);
    }

}

4.6 绑定View

4.6.1 手动绑定

// 绑定多view
@BindViews({R.id.textView1, R.id.textView2, R.id.textView3})
List<TextView> viewList;

// 单个绑定
@BindView(R.id.editText1)
EditText editText;

@BindView(R.id.listView1)
ListView listView;

4.6.2 快捷键(插件)绑定

鼠标选中R.layout.XXX -->> 右键 -->> 选择Generate -->> 选择Generate ButterKnife Injections -->> confirm完成

1 2 3

4.7 绑定Drabable、Anim、Bitmap、String、Array、Dimen、Color

@BindString(R.string.app_name)
String appName;

@BindArray(R.array.list)
String[] array;

@BindBitmap(R.mipmap.ic_launcher)
Bitmap icon;

@BindColor(R.color.colorAccent)
int colorAccent;

@BindDimen(R.dimen.width)
int width;

@BindAnim(R.anim.anim_translate_1)
Animation translateAnimation;

4.8 绑定事件(点击、选择、长按、触摸等等事件)

// 绑定单个按钮
@OnClick(R.id.button1)
public void onClick(View view) {
    showToast("点击了按钮:" + view.toString());
}

// 绑定多个按钮
@OnClick({R.id.button1, R.id.button2, R.id.button3})
public void onClickEx(View view) {
    switch (view.getId()) {
        case R.id.button1:
            break;

        case R.id.button2:
            break;

        case R.id.button3:
            break;
    }
}

@OnTouch(R.id.textView1)
public boolean onTouch(View view) {
    showToast("touch:" + view.toString());
    return true;
}

@OnFocusChange(R.id.editText1)
public void onFocusChange(View view, boolean flag) {
    showToast("焦点改变...");
}

@OnItemClick(R.id.listView1)
public void onItemClickListener(int position) {
    showToast("ListView点击位置:" + position);
}

@OnItemLongClick(R.id.listView1)
public boolean onItemLongClickListener(int position) {
    showToast("ListView长按位置:" + position);
    return true;
}

@OnItemSelected(R.id.spinner1)
public void onItemSelectedClickListener(int position) {
    showToast("Spinner选择位置:" + position);
}

@OnItemSelected(value = R.id.spinner1, callback = OnItemSelected.Callback.NOTHING_SELECTED)
public void onNothingSelectedClickListener() {
    showToast("Spinner未选择item");
}
上一篇下一篇

猜你喜欢

热点阅读