Butterknife專注于android系統(tǒng)的view注入框架,使用Butterknife對性能基本上沒有損失,它的注解并不是運行時反射機制,而是在編譯的時候生成了新的class,項目集成方便,使用也方便。
一、Butterknife的優(yōu)勢:
1.? ?強大的View綁定和Click事件處理功能,簡化了代碼,提升開發(fā)效率
2.? ?方便的處理Adapter里的ViewHolder綁定問題
3.? ?運行時不會影響APP的效率,使用以及配置方便
4.? ?可讀性強
二、ButterKnife使用:
注意事項:
1、在Activity 類中綁定 :ButterKnife.bind(this);必須在setContentView();之后綁定;且父類bind綁定后,子類不需要再bind。
2、在非Activity 類(eg:Fragment、ViewHolder)中綁定: ButterKnife.bind(this,view);這里的this不能替換成getActivity()。
3、在Activity中不需要做解綁操作,在Fragment 中必須在onDestroyView()中做解綁操作。
4、使用ButterKnife修飾的方法和控件,不能用private or static 修飾,否則會報錯。錯誤: @BindViewfields must not be private or static.(com.zyj.wifi.ButterknifeActivity.button1)
5、使用ButterKnife.bind(this,view)綁定一個view的子節(jié)點字段。如果你在子View的布局里或者自定義view的構造方法里 使用了inflate,你可以立刻調用此方法。或者,從XML inflate來的自定義view類型可以在onFinishInflate回調方法中使用它。
依賴:
implementation'com.jakewharton:butterknife:10.2.1'
annotationProcessor'com.jakewharton:butterknife-compiler:10.2.1'
使用:獲取View控件,Click點擊事件處理
Activity使用
在onCreate方法里:
//綁定處理
ButterKnife.bind(this);
View注解
@BindView(R.id.signin_title_usersignin)
TextViewsigninTitleUsersignin;
@BindView(R.id.signin_edit_name)
EditTextsigninEditName;
Click注解
@OnClick({R.id.signin_button_signin})
public void?onViewClicked(View view) {
?//寫入點擊后的邏輯操作
??? }
}
Fragment使用
public class BlankFragment extends Fragment {
??@BindView(R.id.txt)
???TextView txt;
??@BindView(R.id.btn)
???Button btn;
???Unbinder unbinder;
???@Override
???public View onCreateView(LayoutInflater inflater, ViewGroup container,
???????????????????????????????? BundlesavedInstanceState) {
????????// Inflate the layout for this fragment
????????View inflate = inflater.inflate(R.layout.fragment_blank, container,false);
???????????unbinder = ButterKnife.bind(this, inflate);
???????????return inflate;
????? }
????@Override
????public void onDestroyView() {
???????????super.onDestroyView();
??????????unbinder.unbind();
??????}
??????@OnClick(R.id.btn)
??????public void onViewClicked() {
? ? ? //自己的邏輯代碼
???????}
}
額外多加一個知識點:
設置多個view的屬性:
apply()?作用:允許您立即對列表中的所有視圖進行操作。
Action和Setter接口 作用:Action和Setter接口允許指定簡單的行為。
public classMainActivity extends AppCompatActivity {?
??? @BindViews({R2.id.first_name,R2.id.middle_name, R2.id.last_name})?
??? List nameViews;?
??? @Override?
??? protected void onCreate(BundlesavedInstanceState) {?
???????super.onCreate(savedInstanceState);?
???????setContentView(R.layout.activity_main);?
??????? //綁定activity?
??????? ButterKnife.bind(this);?
??????? //設置多個view的屬性?
??????? //方式1:傳遞值?
??????? ButterKnife.apply(nameViews,DISABLE);?
??????? //方式2:指定值?
??????? ButterKnife.apply(nameViews, ENABLED,false);?
??????? ////方式3 設置View的Property?
??????? ButterKnife.apply(nameViews,View.ALPHA, 0.0f);//一個Android屬性也可以用于應用的方法。?
??? }?
??? /*
??? * Action接口設置屬性
??? */?
??? static final ButterKnife.ActionDISABLE = new ButterKnife.Action() {?
??????? @Override?
??????? public void apply(View view, int index){?
??????????? view.setEnabled(false);//目的是使多個view都具備此屬性?
??????? }?
??? };?
??? /*
??? * Setter接口設置屬性
??? */?
??? static final ButterKnife.Setter ENABLED = new ButterKnife.Setter() {?
??????? @Override?
??????? public void set(View view, Booleanvalue, int index) {?
??????????? view.setEnabled(value);//目的是使多個view都具備此屬性,可變boolean值是可以傳遞的?
??????? }?
??? };?
}
三、常用標簽
綁定標簽
1.@BindArray —->綁定String里面的array數(shù)組;
? ? ?@BindArray(R.array.name) String[] names;
2.@BindBitmap —->綁定圖片資源為Bitmap;
? ? ?@BindBitmap(R.mipmap.icon) Bitmap bitmap;
3.@BindString —->綁定一個String變量;
? ? ?@BindString(R.string.username) String name;
4.@BindColor —->綁定color;
? ? ?@BindColor(R.color.colorAccent) int red;
5.? ?@BindDimen—->綁定Dimen;
? ? ?@BindDimen(R.dimen.width) int appWidth;
6.? ?@BindDrawable —->綁定Drawable;
? ? ?@BindDrawable(R.drawable.pic) Drawable myPic;
7.? ?@BinddFloat —->綁定float;
8.? ?@BindInt —->綁定int;
9.? ?@BindBool—->綁定boolean值
事件標簽
1.? ?@OnClick—->點擊事件
2.? ?@OnCheckedChanged —->選中,取消選中
3.? ?@OnEditorAction —->軟鍵盤的功能鍵
4.? ?@OnFocusChange —->焦點改變
5.? ?@OnItemClick item—->被點擊(注意這里有坑,如果item里面有Button等這些有點擊的控件事件的,需要設置這些控件屬性focusable為false)
6.? ?@OnItemLongClick item—->長按(返回真可以攔截onItemClick)
7.? ?@OnItemSelected —->item被選擇事件
8.? ?@OnLongClick —->長按事件
9.? ?@OnPageChange —->頁面改變事件
10. @OnTextChanged —->EditText里面的文本變化事件
11. @OnTouch —->觸摸事件
12. @Optional —->選擇性注入,如果當前對象不存在,就會拋出一個異常,為了壓制這個異常,可以在變量或者方法上加入一下注解,讓注入變成選擇性的,如果目標View存在,則注入, 不存在,則什么事情都不做
四、ButterKnife的代碼混淆
-keep class butterknife.** { *; }?
-dontwarn butterknife.internal.**?
-keep class **$$ViewBinder { *; }?
-keepclasseswithmembernames class * {?
????@butterknife.* ;?
}?
-keepclasseswithmembernames class * {?
????@butterknife.* ;?
}
總結:ButterKnife是一個讓程序員簡化代碼的,提高效率的框架