AndroidMainfest添加權限,android butterknife 自定義view,ButterKnife用法詳解.md

 2023-10-01 阅读 27 评论 0

摘要:# ButterKnife用法詳解### 如何成為T型人才,垂直在一個行業中,必須要有一整套[知識體系](https://github.com/WeiSmart/Android-Advanced-CloudMap),在這里,就一個字堅持~## 前言ButterKnife(黃油刀)是一種IOC框架,專注于Android中View控件

# 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

原始數據

按行查看

歷史

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/108957.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息