ButterKnife使用詳解

官網butterknife

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是一個讓程序員簡化代碼的,提高效率的框架

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容