ButterKnife使用方法

介绍

ButterKnife是为Android View而设的绑定注解,把我们从findViewById()setOnclicktListener()中全面解放。

但是使用ButterKnife的有一些东西需要注意:

  • 属性布局不能用privatestatic修饰,否则会报错
  • 不能通过注解实现setContentView()
  • 调用ButterKnife.bind(this)之前必须先调用setContentView(R.layout.id)
  • 父类已经调用ButterKnife.bind(this),则子类无需再次调用。

ButterKnife Github: https://github.com/JakeWharton/butterknife

ButterKnife 博客: http://jakewharton.github.io/butterknife/

一、导入

在作者的Github中可以获得最新的源码和版本号。下面是Android Studio Gradle使用ButterKnife,演示的版本是8.4.0。如果想知道更多使用的方法,在作者的博客中有详细的介绍。

1.1 build.gradle(Module)

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

....
....

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:23.4.0'
    testCompile 'junit:junit:4.12'

    compile 'com.jakewharton:butterknife:8.4.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}

设置完成后同步一下。

1.2 build.gradle(Project)

在build.gradle(Project)中插入如下代码

dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
}

设置完成后同步一下就完成了。

2.使用

因为每次都要在Activity中的onCreate通过setContentView绑定Activity,所以写一个BaseActivity来完成绑定,子类继承并实现抽象方法。

public abstract class BaseActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentViewId());
        ButterKnife.bind(this);
        afterCreate(savedInstanceState);
    }

    protected abstract int getContentViewId();
    protected abstract void afterCreate(Bundle bundle);
}

MainActivity继承BaseActivity,实现两个抽象方法。

public class MainActivity extends BaseActivity {

    @BindView(R.id.button_click) Button button_click;
    
    @Override
    public int getContentViewId() {
        return R.layout.activity_main;
    }

    /*
     * 以前初始化的工作在onCreate()中完成,现在放在afterCreate().
     */
    @Override
    protected void afterCreate(Bundle bundle) {}
   
}

在对应的xml布局中加入一个按钮,按钮资源名为R.id.button_click,运行然后点击按钮就可以看见按钮字的变化。

三、更多用法

对资源进行绑定

@BindString(R.string.title) String title;
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red;
@BindDimen(R.dimen.spacer) Float spacer;

控件的点击事件绑定。

@OnClick(R.id.button_click)
public void setTextView(Button button){
    button.setText("Button Clicked");
}

如果控件的行为不会被改变,就不需要传控件的引用

@OnClick(R.id.button_click)
public void setTextView(){
    Toast.makeText(this, "Button Clicked", LENGTH_SHORT).show();  
}

多个控件绑定到同一个方法,注意多了一个花括号

@OnClick({R.id.button_click, R.id.text_1})
public void setTextView(){
    Toast.makeText(this, "Clicked", LENGTH_SHORT).show();  
}

相当于给EditText加addTextChangedListener,实现了文本改变监听器。

@OnTextChanged(value = R.id.editText,callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)
void beforeTextChanged(CharSequence s, int start, int count, int after) {}

@OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.TEXT_CHANGED)
void onTextChanged(CharSequence s, int start, int before, int count) {}

@OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void afterTextChanged(Editable s) {}

四、技巧

4.1 免混淆

在proguard配置文件中加入以下规则

-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

4.2 代码生成插件

使用Zelezny能自动生成ButterKnife Injections。

AndroidStudio->File->Settings->Plugins->搜索Zelezny下载添加

Zelezny.png

鼠标先要选中布局文件,如图中选中R.layout.activity_main,然后点击右键,选中Generate

zelezny_1.jpg

点击Generate Butterknife Injections

zelezny_2.jpg

默认选中所有课识别的空间,如果需要OnClick就手动勾选。如果控件已经被绑定,该选项会变为灰色

zelezny_3.jpg

代码自动生成后

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

推荐阅读更多精彩内容