玩转ButterKnife注入框架

在去年这个时候,我写过一篇介绍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:

[java]  view plain  copy
  1. compile 'com.jakewharton:butterknife:8.2.1'  

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

[java]  view plain  copy
  1. buildscript {  
  2.     repositories {  
  3.         jcenter()  
  4.     }  
  5.     dependencies {  
  6.         classpath 'com.android.tools.build:gradle:2.1.0'  
  7.         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'  
  8.   
  9.         // NOTE: Do not place your application dependencies here; they belong  
  10.         // in the individual module build.gradle files  
  11.     }  
  12. }  

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

[java]  view plain  copy
  1. apply plugin: 'android-apt'  

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

[java]  view plain  copy
  1. compile 'com.jakewharton:butterknife:8.2.1'  
  2.     apt 'com.jakewharton:butterknife-compiler:8.2.1'  

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

2.普通控件实例化

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

[java]  view plain  copy
  1. //初始化TextView控件  
  2. @BindView(R.id.tv1)  
  3. TextView tv1;  
  4. @Override  
  5. protected void onCreate(Bundle savedInstanceState) {  
  6.     super.onCreate(savedInstanceState);  
  7.     setContentView(R.layout.activity_main);  
  8.     //绑定控件  
  9.     ButterKnife.bind(this);  
  10.     tv1.setText("Hello ButterKnife");  
  11. }  

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

[java]  view plain  copy
  1. @BindViews({R.id.tv2,R.id.tv3})  
  2.     TextView[] tvs;  

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

3.绑定点击事件

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

[java]  view plain  copy
  1. @OnClick(R.id.tv2)  
  2.     public void click1() {  
  3.         Toast.makeText(MainActivity.this"111", Toast.LENGTH_SHORT).show();  
  4.     }  

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

[java]  view plain  copy
  1. @OnClick({R.id.tv1,R.id.tv3})  
  2.     public void click2(View view) {  
  3.         switch (view.getId()) {  
  4.             case R.id.tv1:  
  5.                 Toast.makeText(MainActivity.this"111", Toast.LENGTH_SHORT).show();  
  6.                 break;  
  7.             case R.id.tv3:  
  8.                 Toast.makeText(MainActivity.this"333", Toast.LENGTH_SHORT).show();  
  9.                 break;  
  10.         }  
  11.     }  

爽吧!

4.资源实例化

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

[java]  view plain  copy
  1. @BindColor(R.color.colorAccent)  
  2.     int tvBg;  
  3.     @BindString(R.string.app_name)  
  4.     String tvStr;  
  5.     @BindDrawable(R.mipmap.ic_launcher)  
  6.     Drawable tvDrawable;  
  7.     @BindDimen(R.dimen.activity_horizontal_margin)  
  8.     int tvMargin;  

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

5.ListView中item控件实例化

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

[java]  view plain  copy
  1. @Override  
  2. public View getView(int position, View convertView, ViewGroup parent) {  
  3.     ViewHolder holder;  
  4.     if (convertView == null) {  
  5.         convertView = inflater.inflate(R.layout.item, parent, false);  
  6.         holder = new ViewHolder(convertView);  
  7.         convertView.setTag(holder);  
  8.     }else{  
  9.         holder = (ViewHolder) convertView.getTag();  
  10.     }  
  11.     holder.iv.setImageResource(R.mipmap.ic_launcher);  
  12.     holder.tv.setText(list.get(position));  
  13.     return convertView;  
  14. }  
  15.   
  16. class ViewHolder {  
  17.     @BindView(R.id.tv)  
  18.     TextView tv;  
  19.     @BindView(R.id.iv)  
  20.     ImageView iv;  
  21.   
  22.     public ViewHolder(View itemView) {  
  23.         ButterKnife.bind(this, itemView);  
  24.     }  
  25. }  

完整代码文末自行下载。

6.Fragment控件实例化

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

[java]  view plain  copy
  1. public class FancyFragment extends Fragment {  
  2.   @BindView(R.id.button1) Button button1;  
  3.   @BindView(R.id.button2) Button button2;  
  4.   
  5.   @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  6.     View view = inflater.inflate(R.layout.fancy_fragment, container, false);  
  7.     ButterKnife.bind(this, view);  
  8.     // TODO Use fields...  
  9.     return view;  
  10.   }  
  11. }  


7.控件的批量操作

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

[java]  view plain  copy
  1. ButterKnife.Action<View> CHANGECOLOR = new ButterKnife.Action<View>() {  
  2.             @Override  
  3.             public void apply(@NonNull View view, int index) {  
  4.                 view.setBackgroundColor(Color.RED);  
  5.             }  
  6.         };  

使用方式如下:

[java]  view plain  copy
  1. ButterKnife.apply(textViews, CHANGECOLOR);  

其中textViews是一个TextView的集合。

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

[java]  view plain  copy
  1. ButterKnife.Setter<View,List<Integer>> CHANGECOLOR2 = new ButterKnife.Setter<View, List<Integer>>() {  
  2.             @Override  
  3.             public void set(@NonNull View view, List<Integer> value, int index) {  
  4.                 view.setBackgroundColor(value.get(index));  
  5.             }  
  6.         };  

使用方式如下:

[java]  view plain  copy
  1. List<Integer> colors = new ArrayList<>();  
  2.         colors.add(Color.RED);  
  3.         colors.add(Color.GREEN);  
  4.         colors.add(Color.BLUE);  
  5.         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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值