android butterknife 自定义view,ButterKnife用法详解.md

# ButterKnife用法详解

### 如何成为T型人才,垂直在一个行业中,必须要有一整套[知识体系](https://github.com/WeiSmart/Android-Advanced-CloudMap),在这里,就一个字坚持~

## 前言

ButterKnife(黄油刀)是一种IOC框架,专注于Android中View控件,事件监听注入。而且,在性能方面的考虑,使用注解+APT编译时解析技术,放弃已往通过放射实现方式。在使用ButterKnife进行项目开发,用起来是比较简洁的,但是简洁的背后不代表容易,后期我会对[ButterKnife](https://jakewharton.github.io/butterknife/)源码进行分析。谢谢大家~~

## Contests

### 一、如何引入环境

```

android {

...

// Butterknife requires Java 8.

compileOptions {

sourceCompatibility JavaVersion.VERSION_1_8

targetCompatibility JavaVersion.VERSION_1_8

}

}

复制代码

```

- #### 依赖增加(java)

```

implementation 'com.jakewharton:butterknife:10.2.1'

annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'

复制代码

```

- #### 依赖增加(Kotlin)

```

implementation 'com.jakewharton:butterknife:10.2.1'

kapt 'com.jakewharton:butterknife-compiler:10.2.1'

复制代码

```

注:使用kapt需要在build.gradle文件引用(apply plugin: 'kotlin-kapt')

### 二、不同场景布局绑定方式(ButterKnife.bind)

#### 2.1、**Activity**里在onCreate方法中加入ButterKnife.bind(this)

```

public class MainActivity extends AppCompatActivity{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//绑定初始化ButterKnife

ButterKnife.bind(this);

}

}

复制代码

```

#### 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

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值