在去年这个时候,我写过一篇介绍Android注解的文章android注解使用详解,这篇文章主要是介绍了Android中的AndroidAnnotations注入框架,AA框架有它自身的一些优点,这里不赘述,但是我总觉得和ButterKnife比起来来世有些差距,今天我们就来看看ButterKnife的正确使用姿势,结合AndroidStudio中ButterKnife的插件,你会发现ButterKnife用起来有多爽!

本文主要包含以下几方面内容:

1.引入框架

2.普通控件实例化

3.绑定点击事件

4.资源实例化

5.ListView中item控件实例化

6.Fragment控件实例化

7.控件的批量操作

OK,那就开始吧!

1.引入框架

在Studio中使用ButterKnife还是非常方便的,引入ButterKnife:

compile 'com.jakewharton:butterknife:8.2.1'

这是目前最新的版本,和7.0的版本比起来使用上还是有一些变化的,那我们玩就玩最新的,那些老旧的版本就不管了。如果是8之前的版本引入这样一句话就够了,但是最新的版本除了这个还需要apt插件,引入方式如下,先修改你你projec的gradle文件变为如下样式:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

然后修改在你的Module的gradle文件中先添加如下一行,表示引用该该插件:

apply plugin: 'android-apt'

最后再来引入ButterKnife和这个插件即可:

compile 'com.jakewharton:butterknife:8.2.1'
apt 'com.jakewharton:butterknife-compiler:8.2.1'

还没看明白?文末下载源码自行研究。

2.普通控件实例化

引入进来之后,我们就可以痛快的使用ButterKnife了,首先当时是先来尝试取消各种烦人的findViewById了,示例如下:

    //初始化TextView控件
@BindView(R.id.tv1)
TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定控件
ButterKnife.bind(this);
tv1.setText("Hello ButterKnife");
}

用木有觉得很爽呢?从此所有的控件都不用findViewById了,当然,我们还可以批量初始化控件:

@BindViews({R.id.tv2,R.id.tv3})
TextView[] tvs;

可以批量操作一个控件数组,也可以批量操作一个控件集合。

3.绑定点击事件

使用了ButterKnife我们也可以进行点击事件的绑定,现在我们在给Activity中的Button设置点击事件的时候大多是在布局文件中添加onClick属性,这种方式适用于Activity却不适用Fragment,如果你想在Fragment中也这么方便的设置点击事件,ButterKnife毫无疑问是你最好的选择。如下:

@OnClick(R.id.tv2)
public void click1() {
Toast.makeText(MainActivity.this, "111", Toast.LENGTH_SHORT).show();
}

使用ButterKnife进行事件绑定的时候对方法名和方法参数都没有要求,你可以随意写。也可以一次给多个控件绑定点击事件,如下:

@OnClick({R.id.tv1,R.id.tv3})
public void click2(View view) {
switch (view.getId()) {
case R.id.tv1:
Toast.makeText(MainActivity.this, "111", Toast.LENGTH_SHORT).show();
break;
case R.id.tv3:
Toast.makeText(MainActivity.this, "333", Toast.LENGTH_SHORT).show();
break;
}
}

爽吧!

4.资源实例化

ButterKnife除了控件的实例化之外,还可以进行资源实例化,主要包括res文件夹中的资源文件,如下:

@BindColor(R.color.colorAccent)
int tvBg;
@BindString(R.string.app_name)
String tvStr;
@BindDrawable(R.mipmap.ic_launcher)
Drawable tvDrawable;
@BindDimen(R.dimen.activity_horizontal_margin)
int tvMargin;

资源的读取,从此也是一行代码解决。

5.ListView中item控件实例化

可能有小伙伴要问了,那如果在ListView中又该如何初始化Item中的控件呢?很简单,只需要稍微修改一下ViewHolder和getView方法即可,如下:

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.iv.setImageResource(R.mipmap.ic_launcher);
holder.tv.setText(list.get(position));
return convertView;
} class ViewHolder {
@BindView(R.id.tv)
TextView tv;
@BindView(R.id.iv)
ImageView iv; public ViewHolder(View itemView) {
ButterKnife.bind(this, itemView);
}
}

完整代码文末自行下载。

6.Fragment控件实例化

Fragment中的控件实例化和Adapter中的基本一致,就是绑定的地方特别注意,来一个官方的Demo吧,我就不写了:

public class FancyFragment 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;
}
}

7.控件的批量操作

ButterKnife中还有一个好玩的地方莫过于控件的批量操作,我们可以定义统一的行为,来设置给某一组控件,比如我想给我某一组的TextView修改背景颜色,可以定义如下行为:

ButterKnife.Action<View> CHANGECOLOR = new ButterKnife.Action<View>() {
@Override
public void apply(@NonNull View view, int index) {
view.setBackgroundColor(Color.RED);
}
};

使用方式如下:

ButterKnife.apply(textViews, CHANGECOLOR);

其中textViews是一个TextView的集合。

如果你想给TextView设置不同的背景颜色,那么还可以这样来定义:

ButterKnife.Setter<View,List<Integer>> CHANGECOLOR2 = new ButterKnife.Setter<View, List<Integer>>() {
@Override
public void set(@NonNull View view, List<Integer> value, int index) {
view.setBackgroundColor(value.get(index));
}
};

使用方式如下:

List<Integer> colors = new ArrayList<>();
colors.add(Color.RED);
colors.add(Color.GREEN);
colors.add(Color.BLUE);
ButterKnife.apply(textViews,CHANGECOLOR2,colors);

8.相关插件

在Studio中使用ButterKnife有一个非常好的插件,叫做:Android ButterKnife Zelezny,大家自行安装学习使用姿势。

OK,这就是ButterKnife一个简单的使用。官方文档地址http://jakewharton.github.io/butterknife/

本文案例下载:http://download.csdn.net/detail/u012702547/9602107

玩转ButterKnife注入框架的更多相关文章

  1. View注入框架:Butterknife简单使用

    View注入框架 下载地址 1.Activity Binging 通过@Bind凝视字段,Butter Knife能够通过View的ID自己主动找到并把对应的视图布局. class ExampleAc ...

  2. ButterKnife--View注入框架的使用

    作为一名Android开发,是不是经常厌烦了大量的findViewById以及setOnClickListener代码,而ButterKnife是一个专注于Android系统的View注入框架,让你从 ...

  3. ButterKnife--View注入框架

    俗话说,不会偷懒的程序员不是好程序员!作为一名Android的开发者,我们已经厌烦了经常写大量的findViewById以及setOnClickListener代码.而ButterKnife是一个专注 ...

  4. Butter Knife:一个安卓视图注入框架

    Butter Knife:一个安卓视图注入框架 2014年5月8日 星期四 14:52 官网: http://jakewharton.github.io/butterknife/ GitHub地址: ...

  5. Android ButterKnife注解框架使用

    这段时间学习了下ButterKnife注解框架,学习的不是特别深入,但是基础也差不多了,在此记录总结一下. ButterKnife是一个Android View注入的库,主要是注解的使用,可以减少很多 ...

  6. 开源框架相关面试问题-butterknife注解框架面试问题讲解

    butterknife使用简介: 它的出现主要是为了解决咱们在android开发中会写大量的findViewById().setOnClickListener()这样的索然无味的代码,其实它就是一个依 ...

  7. android 注入框架 DI

    android 主要注入框架以及github如下: (1)Roboguice https://github.com/roboguice/roboguice (2)Butterknife https:/ ...

  8. [Android]依赖注入框架google的dagger

    分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...

  9. [Android]依赖注入框架squareup的dagger

    分享一下Android依赖注入框架--Dagger使用 Dagger源码 Dagger1-Demo 希望能给大家的开发带来帮助.

随机推荐

  1. rails3 Bundle简介

    Rails 3开始使用bundle来管理项目的gem依赖.该命令只在一个含有Gemfile的目录下执行. Gemfile: Rails 项目所有的依赖包都在这里配置,不像以前通过require来查找 ...

  2. Emeditor所有快捷键操作

    新建文本    Ctrl+N         创建一个新的文本文件. 打开         Ctrl+O    打开一个已存在的文件. 保存         Ctrl+S     保存当前文件. 重新 ...

  3. android & Linux uevent机制

    Linux uevent机制 Uevent是内核通知android有状态变化的一种方法,比如USB线插入.拔出,电池电量变化等等.其本质是内核发送(可以通过socket)一个字符串,应用层(andro ...

  4. bzoj1324

    经典例题 在<最小割模型在信息学竞赛中的应用>有详细的解答就不赘述了 主要想说,其实这题的几个结论其实是很好猜出来的: 当摸不清题目本质的时候,不妨多找几种情况,猜测一下 顺便推广一下几个 ...

  5. WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

    首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼 ...

  6. Nagios Core/Icinga 基于栈的缓冲区溢出漏洞

    漏洞名称: Nagios Core/Icinga 基于栈的缓冲区溢出漏洞 CNNVD编号: CNNVD-201402-484 发布时间: 2014-03-03 更新时间: 2014-03-03 危害等 ...

  7. jquery封装的选项卡

    ul,li,div{ margin:; padding:;} ul,li{ list-style:none;} .tab_wrap{ width:450px; margin: auto 50px; o ...

  8. SharePoint 2010在win7 x64 安装

    转:http://kaneboy.blog.51cto.com/1308893/328000 关于<SharePoint 2010应用程序开发指南>,我和杜伟同学正在撰写中,希望下半年早点 ...

  9. 浅谈MS-SQL锁机制

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...

  10. 《Android View 的事件分发和滑动冲突》 —预习资料

    1. 阅读书籍<Android开发艺术探索>第三章 2. 提前阅读如下技术文章: http://blog.csdn.net/singwhatiwanna/article/details/3 ...