介紹
ButterKnife是為Android View而設的綁定注解恳邀,把我們從findViewById()
和setOnclicktListener()
中全面解放。
但是使用ButterKnife的有一些東西需要注意:
- 屬性布局不能用
private
或static
修飾灶轰,否則會報錯 - 不能通過注解實現(xiàn)
setContentView()
- 調(diào)用
ButterKnife.bind(this)
之前必須先調(diào)用setContentView(R.layout.id)
- 父類已經(jīng)調(diào)用
ButterKnife.bind(this)
轩娶,則子類無需再次調(diào)用。
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來完成綁定并蝗,子類繼承并實現(xiàn)抽象方法。
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秸妥,實現(xiàn)兩個抽象方法滚停。
public class MainActivity extends BaseActivity {
@BindView(R.id.button_click) Button button_click;
@Override
public int getContentViewId() {
return R.layout.activity_main;
}
/*
* 以前初始化的工作在onCreate()中完成,現(xiàn)在放在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惹想,實現(xiàn)了文本改變監(jiān)聽器。
@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配置文件中加入以下規(guī)則
-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下載添加
鼠標先要選中布局文件激挪,如圖中選中R.layout.activity_main
,然后點擊右鍵草穆,選中Generate
點擊Generate Butterknife Injections
默認選中所有課識別的空間,如果需要OnClick
就手動勾選搓译。如果控件已經(jīng)被綁定悲柱,該選項會變?yōu)榛疑?/p>
代碼自動生成后