ButterKnife入门教程

版权所有,转载请注明出处: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");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350