# ButterKnife用法詳解
### 如何成為T型人才,垂直在一個行業中,必須要有一整套[知識體系](https://github.com/WeiSmart/Android-Advanced-CloudMap),在這里,就一個字堅持~
## 前言
ButterKnife(黃油刀)是一種IOC框架,專注于Android中View控件,事件監聽注入。而且,在性能方面的考慮,使用注解+APT編譯時解析技術,放棄已往通過放射實現方式。在使用ButterKnife進行項目開發,用起來是比較簡潔的,但是簡潔的背后不代表容易,后期我會對[ButterKnife](https://jakewharton.github.io/butterknife/)源碼進行分析。謝謝大家~~
## Contests
AndroidMainfest添加權限?### 一、如何引入環境
```
android {
...
// Butterknife requires Java 8.
compileOptions {
android bottomnavigationview,sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
復制代碼
```
安卓自定義viewgroup。- #### 依賴增加(java)
```
implementation 'com.jakewharton:butterknife:10.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
復制代碼
```
如何自定義view。- #### 依賴增加(Kotlin)
```
implementation 'com.jakewharton:butterknife:10.2.1'
kapt 'com.jakewharton:butterknife-compiler:10.2.1'
復制代碼
```
android,注:使用kapt需要在build.gradle文件引用(apply plugin: 'kotlin-kapt')
### 二、不同場景布局綁定方式(ButterKnife.bind)
#### 2.1、**Activity**里在onCreate方法中加入ButterKnife.bind(this)
```
public class MainActivity extends AppCompatActivity{
@Override
butterknife原理,protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定初始化ButterKnife
ButterKnife.bind(this);
}
自定義view加載。}
復制代碼
```
#### 2.2、**Fragment**中先使用inflater返回一個view,再使用ButterKnife.bind(this, view)綁定
```
public class ButterknifeFragment extends Fragment{
private Unbinder mUnbinder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
//返回一個Unbinder值(進行解綁),注意這里的this不能使用getActivity()
mUnbinder = ButterKnife.bind(this, view);
return view;
}
/**
* onDestroyView中進行解綁操作
*/
@Override
public void onDestroyView() {
super.onDestroyView();
if(mUnbinder!=null){
mUnbinder.unbind();
}
}
}
復制代碼
```
注:你需要對其進行解綁
#### 2.3、**Adapter**的內部類ViewHolder,只需要在構造函數調用ButterKnife.bind(this, view)進行綁定
```
public class ButterknifeAdapter extends BaseAdapter {
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.testlayout, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
}
holder.title.setText("xxx");
holder.nmae.setText("xxx");
return view;
}
static class ViewHolder {
@BindView(R2.id.title) TextView title;
@BindView(R2.id.name) TextView name;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
復制代碼
```
### 三、View綁定解鎖(@BindView)
#### 3.1、單個控件綁定
```
@BindView(R2.id.first_name)
EditText firstName;
@BindView(R2.id.middle_name)
EditText middleName;
@BindView(R2.id.last_name)
EditText lastName;
復制代碼
```
#### 3.2、多控件一次性綁定
```
public class MainActivity extends AppCompatActivity {
@BindViews({ R2.id.first_name, R2.id.middle_name, R2.id.last_name})
List nameViews ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
nameViews.get( 0 ).setText( "hello 1 ");
nameViews.get( 1 ).setText( "hello 2 ");
nameViews.get( 2 ).setText( "hello 3 ");
}
}
復制代碼
```
### 四、OnClick事件綁定解鎖
#### 4.1、OnClick和OnLongClick單個點擊事件處理
```
public class MainActivity extends AppCompatActivity {
@OnClick(R2.id.button1)
public void onViewClicked() {
Toast.makeText(this, "這是綁定的點擊事件", Toast.LENGTH_SHORT).show();
}
@OnLongClick(R2.id.button2)
public boolean onViewClickeds(){
Toast.makeText(this, "這是綁定的長按事件", Toast.LENGTH_SHORT).show();
return true ;
}
}
復制代碼
```
#### 4.2、多個點擊事件處理
```
@OnClick({R2.id.button1, R2.id.button2})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.button1:
Toast.makeText(this, "button1點擊事件", Toast.LENGTH_SHORT).show();
break;
case R.id.button2:
Toast.makeText(this, "button2點擊事件", Toast.LENGTH_SHORT).show();
break;
}
}
復制代碼
```
#### 4.3、自定義類型事件處理
- ##### ViewPager中監聽事件OnPageSelected()
```
@OnPageChange(R2.id.viewpager)
public void onPageSelected(int position) {
switch (position) {
case 0:
//滑動到第一頁
break;
case 1:
//滑動到第二頁
break;
}
}
復制代碼
```
- ##### RadioGroup+RadioButton中監聽事件OnCheckedChanged()
```
@OnCheckedChanged({R2.id.click1,R2.id.click2})
public void OnCheckedChangeListener(CompoundButton view, boolean ischanged ){
switch (view.getId()) {
case R.id.click1:
if (ischanged){
//注意:這里一定要有這個判斷,只有對應該id的按鈕被點擊了,ischanged狀態發生改變,才會執行下面的內容
//這里寫你的按鈕變化狀態的UI及相關邏輯
}
break;
case R.id.click2:
if (ischanged) {
//這里寫你的按鈕變化狀態的UI及相關邏輯
}
break;
default:
break;
}
}
復制代碼
```
- ##### 其他事件
| 注解 | **功能** |
| --------------------- | ------------------------------------------------------------ |
| @OnEditorAction | 軟鍵盤的功能鍵 |
| @OnFocusChange | 焦點改變 |
| @OnItemClick item | 被點擊(注意這里有坑,如果item里面有Button等這些有點擊的控件事件的,需要設置這些控件屬性focusable為false) |
| @OnItemLongClick item | 長按(返回真可以攔截onItemClick) |
| @OnItemSelected | item被選擇事件 |
| @OnTextChanged | EditText里面的文本變化事件 |
| @OnPageSelected | ViewPager滑動選擇事件 |
| @OnCheckedChanged | RadioGroup選擇事件 |
### 五、Resource綁定解鎖
#### 5.1、Bitmap圖片資源綁定
```
@BindBitmap(R2.mipmap.icon)
Bitmap bitmap;
復制代碼
```
#### 5.2、String字符串資源綁定
```
@BindString(R2.string.name)
String name;
復制代碼
```
#### 5.3、String字符串數組資源綁定
```
廣州市
深圳市
汕頭市
@BindArray(R2.array.city) //綁定string里面array數組
String [] citys ;
復制代碼
```
#### 5.4、ColorResId 資源綁定:
```
@BindColor(R2.color.white)
int white;
復制代碼
```
#### 5.5、Dimen資源綁定
```
@BindDimen(R2.dimen.width)
int width;
復制代碼
```
#### 5.6、Drawable資源綁定
```
@BindDrawable(R2.drawable.image)
Drawable image;
復制代碼
```
### 六、基本類型綁定解鎖
#### 6.1、綁定Int類型
```
@BindInt(R2.int.size)
int size;
復制代碼
```
#### 6.2、綁定Bool類型
```
@BindBool(R2.bool.flag)
boolean flag;
復制代碼
```
#### 6.3、綁定Float類型
```
@BindFloat(R2.dimen.size)
float size;
復制代碼
```
### 七、其他用法
#### 7.1、通過apply方法可以一次性對列表中的所有視圖進行操作
```
@BindViews({ R2.id.first_name, R2.id.middle_name, R2.id.last_name })
List nameViews;
ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);
//Action和Setter接口允許指定簡單行為。
static final ButterKnife.Action DISABLE = new ButterKnife.Action() {
@Override public void apply(View view, int index) {
view.setEnabled(false);
}
};
static final ButterKnife.Setter ENABLED = new ButterKnife.Setter() {
@Override public void set(View view, Boolean value, int index) {
view.setEnabled(value);
}
};
//Android屬性也可以與apply方法一起使用。
ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
復制代碼
```
#### 7.2、View和事件綁定的時候,出現找不到目標視圖,將會導致異常發生
若要抑制此行為并創建可選綁定,請在字段中添加@Nullable批注或在方法中添加@Optional批注。
```
@Nullable
@BindView(R2.id.title)TextView mTitle;
@Optional
@OnClick(R2.id.click)
public void onViewClicked() {
// TODO ...
}
復制代碼
```
一鍵復制
編輯
Web IDE
原始數據
按行查看
歷史
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态