ButterKnife是Android的View 注入框架,以前總通過findViewById來找到View對象,有了ButterKnife可以很輕鬆的省去這些步驟,最重要的一點是,使用ButterKnife對性能基本沒有損失,因爲ButterKnife用到的註解並不是在運行時反射的,而是在編譯的時候生成新的class。項目集成起來也是特別方便,使用起來也是特別簡單。
JakeWharton大神的github地址
配置編譯環境
./build.gradle
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
}
./app/build.gradle
apply plugin: 'com.jakewharton.butterknife'
...
dependencies {
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
初始化佈局,調用 bind 方法初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
}
用註解標註需要註解的對象
//綁定View
@BindView(R.id.name)AutoCompleteTextView mNameView;
//綁定資源
@BindString(R.string.show) String show;
//綁定事件
@OnClick(R.id.sign_in_button) void submitLogin() {
attemptLogin();
}
基本使用
- @BindView()
@BindViews()
@BindViews({ R2.id.button1, R2.id.button2, R2.id.button3}) public List<Button> buttonList
@BindString() ==> 綁定一個String id爲一個String變量
- @BindArray() ==> 綁定string裏面array數組
- @BindBitmap() ==> 綁定Bitmap 資源
- @BindBool ==>綁定boolean值
- @BindDimen ==>綁定Dimen
- @BindDrawable ==> 綁定Drawable
- @BindFloat ==>綁定float
- @BindInt ==>綁定int
- @BindColor()
@OnClick()
指定多個id綁定事件
@OnClick({R.id.id1, R.id.id2, R.id.id3, R.id.id4}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.id1: System.out.print("我是點擊事件1"); break; case R.id.id2: System.out.print("我是點擊事件2"); break; case R.id.id3: System.out.print("我是點擊事件3"); break; case R.id.id4: System.out.print("我是點擊事件4"); break; } }
單個綁定中指定多個id,用於公共事件處理
@OnClick(R.id.id1,R.id.id2,R.id.id3) public void sayHi(Button button) {//多個控件對應公共事件 button.setText("Success!"); }
@OnClick==>點擊事件
- @OnCheckedChanged ==>選中,取消選中
- @OnEditorAction ==>軟鍵盤的功能鍵
- @OnFocusChange ==>焦點改變
- @OnItemClick item ==>被點擊(注意這裏有坑,如果item裏面有Button等這些有點擊的控件事件的,需要設置這些控件屬性focusable爲false)
- @OnItemLongClick item ==>長按(返回真可以攔截onItemClick)
- @OnItemSelected ==>item被選擇事件
- @OnLongClick ==>長按事件
- @OnPageChange ==>頁面改變事件
- @OnTextChanged ==>EditText裏面的文本變化事件
- @OnTouch ==>觸摸事件
@Optional ==>選擇性注入,如果當前對象不存在,就會拋出一個異常,爲了壓制這個異常,可以在變量或者方法上加入一下註解,讓注入變成選擇性的,如果目標View存在,則注入, 不存在,則什麼事情都不做
@Optional @OnCheckedChanged(R.id.cb_test) public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){ if(isChecked){ tvTest.setText("被選中..."); }else{ tvTest.setText("被取消..."); } }
混淆
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}