A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐杨老师 中级黑马   /  2016-3-9 11:50  /  4570 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ButterKnife 7.0用法:


解决什么问题:
用注解形式绑定成员变量和方法. 解放劳动力再也不用写一大堆类似
findViewById
setOnClickListenersetOnItemClickListener
这样的代码了

同类技术:
AndroidAnnotations, Dagger, roboguice, guice

官网地址:
https://github.com/JakeWharton/butterknife
http://jakewharton.github.io/butterknife/

使用准备:
在build.gradle中添加一行依赖:
  1. compile 'com.jakewharton:butterknife:7.0.1'
复制代码

使用步骤:
1. 在Activity里的写法

  1.    // 绑定View对象
  2.     @Bind(R.id.title) TextView title;
  3.     @Bind(R.id.subtitle) TextView subtitle;
  4.     @Bind(R.id.footer) TextView footer;
  5.     @Override
  6.     public void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         setContentView(R.layout.activity_main);
  9.         ButterKnife.bind(this);
  10.         // TODO 在这里直接用变量即可
  11.     }
复制代码

2. 在Fragment里的写法:
注意最好在onDestoryView中进行解绑

  1. /**
  2. * Fragment生命周期比较特殊
  3. * 需要在onDestroyView及时释放这些View引用,避免造成内存溢出
  4. */
  5. public class FancyFragment extends Fragment {
  6.     @Bind(R.id.button1)
  7.     Button button1;
  8.     @Bind(R.id.button2)
  9.     Button button2;
  10.     @Override
  11.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  12.         View view = inflater.inflate(R.layout.fancy_fragment, container, false);
  13.         ButterKnife.bind(this, view); // 进行绑定
  14.         // TODO Use fields...
  15.         return view;
  16.     }
  17.     @Override
  18.     public void onDestroyView() {
  19.         super.onDestroyView();
  20.         ButterKnife.unbind(this); // 解除绑定
  21.     }
  22. }
复制代码

3. 在数据适配器的ViewHolder中的写法:
  1.   static class ViewHolder {
  2.     @Bind(R.id.title) TextView name;
  3.     @Bind(R.id.job_title) TextView jobTitle;
  4.     public ViewHolder(View view) {
  5.       ButterKnife.bind(this, view); // 进行绑定, 将view中的指定id对当前对象进行注入
  6.     }
  7.   }
复制代码

4. 依赖注入的其他写法:


  1. // 也可以将这些View放到集合中
  2.     @Bind({ R.id.title, R.id.subtitle, R.id.footer })
  3.     List<TextView> textViews;
  4.     // 绑定字符串
  5.     @BindString(R.string.app_name) String titile;
  6.     // 绑定图片
  7.     @BindDrawable(R.drawable.ic_launcher) Drawable drawable;
  8.     // 绑定颜色值, 也可以是颜色选择器
  9.     @BindColor(R.color.colorPrimary) int colorPrimary; // int or ColorStateList field
  10.     // 绑定以像素为单位的尺寸或数值
  11.     @BindDimen(R.dimen.spacer) float spacer; // int (for pixel size) or float (for exact value) field
  12.     /**
  13.      * 给指定控件添加点击事件, 注意:参数View可以省略, 或者写成Button
  14.      * @param view
  15.      */
  16.     @OnClick(R.id.bt_test)
  17.     public void submit(View view) {
  18.         // TODO submit data to server...
  19.         Toast.makeText(this, "single declare!", Toast.LENGTH_SHORT).show();
  20.     }
  21.     /**
  22.      * 给多个控件添加点击事件, 注意:参数View可以省略, 或者写成Button
  23.      * @param view
  24.      */
  25.     @OnClick({R.id.bt_test, R.id.bt_test2})
  26.     public void submit2(View view) {
  27.         // TODO submit data to server...
  28.         switch (view.getId()) {
  29.             case R.id.bt_test:
  30.                 Toast.makeText(this, "multi declare1!", Toast.LENGTH_SHORT).show();
  31.                 break;
  32.             case R.id.bt_test2:
  33.                 Toast.makeText(this, "multi declare2!", Toast.LENGTH_SHORT).show();
  34.                 break;
  35.         }
  36.     }
  37.     /**
  38.      * 添加长按事件
  39.      * @return 表示是否消费长按事件  true消费
  40.      */
  41.     @OnLongClick(R.id.bt_test) boolean sayGetOffMe() {
  42.         Toast.makeText(this, "Let go of me!", Toast.LENGTH_SHORT).show();
  43.         return true;
  44.     }
  45.     // 给ListView添加条目点击监听
  46.     @OnItemSelected(R.id.list_view)
  47.     void onItemSelected(int position) {
  48.         // TODO ...
  49.     }
复制代码

添加混淆忽略:

  1. -keep class butterknife.** { *; }
  2. -dontwarn butterknife.internal.**
  3. -keep class **$ViewBinder { *; }

  4. -keepclasseswithmembernames class * {
  5.     @butterknife.* <fields>;
  6. }

  7. -keepclasseswithmembernames class * {
  8.     @butterknife.* <methods>;
  9. }
复制代码

有时出现编译问题还需要在build.gradle中添加
  1. packagingOptions {
  2.   exclude 'META-INF/services/javax.annotation.processing.Processor'
  3. }
复制代码











ButterKnifeTest.zip

6.42 MB, 下载次数: 171

代码示例项目

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马