Android 框架之ButterKnife

ButterKnife 是一个Android系统的View注入框架 , 使用它我们再也不用写大量的findViewById 和 setOnClickListener 等代码 . 即使真有使用findViewById的需要也是可以省略强制类型转换 . 所有这个框架真的是很好 .

简单使用

正常情况下我们绑定控件使用findViewById方式如下.

class ExampleActivity extends Activity {
  TextView title;
  TextView subtitle;
  TextView footer;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    // 绑定控件 
    title = (TextView)findViewById(R.id.title);
    subtitle = (TextView)findViewById(R.id.subtitle);
    footer = (TextView)findViewById(R.id.footer);
  }
}

如果们使用ButterKnife代码如下.

class ExampleActivity extends Activity {
  @BindView(R.id.title) TextView title;
  @BindView(R.id.subtitle) TextView subtitle;
  @BindView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    // 绑定这个Activity,这是必须的否则无法实现绑定控件.和其他操作.
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}

从上面可以看出我们只需要注解进行绑定即可.省略了大量的findViewById的代码.

配置ButterKnife(8.4.0 版本)

  • 安装ButterKnife插件.
    ButterKnife 插件

  • 配置 build.gradle 文件

    • Module的build.gradle添加如下依赖.
      compile 'com.jakewharton:butterknife:8.4.0'
      annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'

    配置一

    • 在项目的build.gradle 中添加如下代码
      classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'

    配置二

同步项目即可正常是用ButterKnife.

资源绑定

使用ButterKnife的@Bindxxx系列注解(xxx 代表资源类型如 : bool, int, drawable 等)可以绑定预先定义好的资源.

class ExampleActivity extends Activity {
  @BindString(R.string.title) String title;
  @BindDrawable(R.drawable.ic_header) Drawable ic_header;
  @BindColor(R.color.black) int black; 
  @BindDimen(R.dimen.size) Float spacer; 
  @BindInt(R.int.number) Integer number;
}

绑定Fragment中的控件.

通过绑定自定义View可以实现绑定任意对象

// Fragment 中的控件的绑定.
public class MyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(R.id.button2) Button button2;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }
}

简化ListView中的ViewHolder的绑定

public class MyAdapter 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.whatever, parent, false);
      holder = new ViewHolder(view);
      view.setTag(holder);
    }

    holder.name.setText("ButterKnife 绑定了.");
    // ...
    return view;
  }

  static class ViewHolder {
    @BindView(R.id.title) 
    TextView name;
    @BindView(R.id.text) 
    TextView text;

    public ViewHolder(View view) {
      ButterKnife.bind(this, view);
    }
  }
}

绑定一组View到一个List或者Array中.

// 绑定三个控件到List中.
@BindViews({ R.id.first_view, R.id.second_view, R.id.third_view })
List<EditText> mViews;

使用 ButterKnife的apply 方法可以设置上面集合中的View属性.

// 将三个View都设置成Disable
ButterKnife.apply(mViews, DISABLE);
// 将三个View都设置成不可点击.
ButterKnife.apply(mViews, ENABLED, false);

使用Action 和 Setter 接口.

使用Action和Setter接口可以定义一些行为.

// 使用Action接口定义DISABLE的行为.
static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
  @Override public void apply(View view, int index) {
    view.setEnabled(false);
  }
};
// 使用Setter接口定义ENABLED的行为.
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
  @Override public void set(View view, Boolean value, int index) {
    view.setEnabled(value);
  }
};

设置任意属性

// 设置所有View的透明度.
ButterKnife.apply(mViews, View.ALPHA, 0.0f);

绑定 listener

使用@OnClick注解可以绑定点击事件,关于绑定方法有如下几种形式

  • 没有参数 : 如果不需要操作控件可以不带参数
// 省略参数
@OnClick(R.id.btn)
public void btnClicked() {
  // do something
}
  • 带有一个参数 : 可以View ,也可以是具体的类型比如Button.
// 绑定按钮的点击事件
@OnClick(R.id.btn)
public void btnClicked(View view) {
  // do something
}
// 直接指定类型.
@OnClick(R.id.btn)
public void btnClicked(Button view) {
  // do something
}
  • 绑定多个控件到同一个方法上.
// 指定多个控件的到同一个方法上
@OnClick({R.id.btn,R.id.btn2,R.id.btn3})
public void btnClicked(View view) {
  // do something
}
  • 自定义控件可以直接绑定自身的Listener,不用指定ID
public class MyButton extends Button {
  @OnClick
  public void onClick() {
    // do something!
  }
}

取消绑定

ButterKnife在绑定时会返回一个Unbinder对象可以使用它来解除绑定.

public class MyFragment extends Fragment {
  @BindView(R.id.button1) 
  Button button1;
  @BindView(R.id.button2) 
  Button button2;
  private Unbinder unbinder;

  @Override 
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    unbinder = ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }
  @Override 
  public void onDestroyView() {
    super.onDestroyView();
    // 解除绑定
    unbinder.unbind();
  }
}

处理异常

ButterKnife 在绑定控件是如果没有找到个指定的控件,则会抛出异常, 可以使用@Nullable 和 @optional注解来解决.

// 绑定控件使用@Nullable
@Nullable 
@BindView(R.id.btn) 
TextView btn;
// 绑定Listener , @Optional 
@Optional 
@OnClick(R.id.btn) 
void onBtnClicked() {
  // TODO ...
}

Item点击事件绑定.

// ListView Item 点击事件绑定
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
  // TODO ...
}
// 绑定两个.Item的listener
@OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)
void onNothingSelected() {
  // TODO ...
}

findById 方法

使用findById可以和findViewById用法一样,但是ButterKnife会自动进行类型转化.

View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);

OK ButterKnife 8.4.0 简单使用结束.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值