使人超赞的ButterKnife8.8.1—快捷、方面、好用!你还在等什么

ButterKnife8.8.1的用法

什么是ButterKnife

ButterKnife是目前经常使用的一种依托Java注解机制实现辅助代码生成的框架;用到了注解处理器。
它是一个专一于Android系统的View注入框架,将Android视图和回调方法绑定到成员变量和方法上;可视化一键生成;能够减小大量的findViewById以及setOnClickListener代码,是注解中相对简单易懂的开源框架 。html

一句话归纳:依赖注入框架,主要用于注解,减小代码。butterknife表面意思黄油刀java

ButterKnife 优点:

  • 1.强大的View绑定和Click事件处理功能,简化代码,提高开发效率
  • 2.方便的处理Adapter里的ViewHolder绑定问题
  • 3.运行时不会影响APP效率,使用配置方便
  • 4.代码清晰,可读性强

使用心得:

  • 1.Activity ButterKnife.bind(this);必须在setContentView();以后,且父类bind绑定后,子类不须要再bind,Activity不须要unbind
  • 2.Fragment ButterKnife.bind(this, mRootView);
  • 3.属性布局不能用private or static 修饰,不然会报错
  • 4.setContentView()不能经过注解实现。(其余的有些注解框架能够)

使用方法

  • 导入android

    导入.png
    导入.png

    gradle中须要进行导入
    gradle中须要进行导入

  • 一键生成资源idgit

    该图引依凡王子的博客: www.cnblogs.com/zhengjunfei…github

    一键生成资源id.gif
    一键生成资源id.gif

英文使用说明地址:jakewharton.github.io/butterknife…c#

API文档地址:
jakewharton.github.io/butterknife…设计模式

GitHub源码地址:
github.com/JakeWharton…数组

很早出现的方法onCLick监听.png
很早出现的方法onCLick监听.png

测试效果以下bash

butterKnife8.8.1Framgment测试
butterKnife8.8.1Framgment测试

butterKnife8.8.1绑定View测试
butterKnife8.8.1绑定View测试

注意事项

  • 1)在Activity 类中绑定 :ButterKnife.bind(this);微信

    必须在setContentView();以后绑定;且父类bind绑定后,子类不须要再bind。

  • 2)在非Activity 类(eg:Fragment、ViewHold)中绑定:

    ButterKnife.bind(this,view);

    这里的this不能替换成getActivity()。

  • 3)activity中不须要解绑

    在Activity中不须要作解绑操做,在Fragment 中必须在onDestroyView()中作解绑操做。

  • 4)ButterKnife的修饰符

    使用ButterKnife修饰的方法和控件,不能用private or static 修饰,不然会报错。

  • 5)setContentView()不能经过注解实现。(其余的有些注解框架能够)

  • 6)对于mvc设计模式

    使用Activity为根视图绑定任意对象时,若是你使用相似MVC的设计模式你能够在Activity 调用ButterKnife.bind(this, activity),来绑定Controller。

  • 7)子View的相关绑定

    使用ButterKnife.bind(this,view)绑定一个view的子节点字段。若是你在子View的布局里或者自定义view的构造方法里 使用了inflate,你能够马上调用此方法。或者,从XML inflate来的自定义view类型能够在onFinishInflate回调方法中使用它。

  • 8)修饰类型不能是:private 或者 static

    不然会报错:错误: 
      @BindView fields must not be private or static. (com.ButterknifeActivity.button)复制代码

    bind资源

  • 绑定颜色

    @BindColor(android.R.color.background_dark)
      @ColorInt
      int whiteColor;复制代码
  • 绑定View

    @BindView(android.R.id.button3) 
      View button3;复制代码
  • 绑定多个View
    @BindViews({R2.id.first_name, R2.id.middle_name, R2.id.last_name})
      List<EditText> nameViews;复制代码
  • 绑定String资源数组
    <string-array name="city">
          <item>北京市</item>
          <item>天津市</item>
          <item>哈尔滨市</item>
          <item>大连市</item>
          <item>香港市</item>
      </string-array>
       @BindArray(R.array.city)
      protected String [] mStrings;复制代码
  • 绑定Bitmap 资源

    复制代码

事件的bind注解

  • @OnClick---->点击事件

  • @OnCheckedChanged ---->选中,取消选中

  • @OnEditorAction ---->软键盘的功能键
  • @OnFocusChange ---->焦点改变
  • @OnItemClick item---->条目被点击(
    注意这里有坑,若是item里面有Button等这些有点击    的控件事件的,须要设置这些控件属性focusable为false)复制代码
  • @OnItemLongClick item---->长按(返回真能够拦截onItemClick)
  • @OnItemSelected ---->item被选择事件
  • @OnLongClick ---->长按事件
  • @OnPageChange ---->页面改变事件
  • @OnTextChanged ---->EditText里面的文本变化事件
  • @OnTouch ---->触摸事件
  • @Optional ---->

设置多个View重点讲解

绑定多个OnCLick

@OnClick({R.id.view_test1,R.id.btn_s01,R.id.btn_s02})
    public void onCLick1(View view){
        switch (view.getId()){
            case R.id.view_test1:
                iv_f2.setImageBitmap(rabot);
                break;
            case R.id.btn_s01:
                GetToast.useString(getActivity(),"按钮1");
                break;
            case R.id.btn_s02:
                GetToast.useString(getActivity(),"按钮2");
                break;
        }
    }复制代码

绑定listView的OnItemClick

@OnItemClick(R.id.lv_List)
    public void OnItemClick(int index){
        GetToast.useString(getActivity(),"this is OnItemClick the index :"+index);
    }复制代码

绑定listView的OnItemLongClick

@OnItemLongClick(R.id.lv_List)
    public boolean OnItemLongClick(int index){
        GetToast.useString(getActivity(),"this is the OnItemLongClick index :"+index);
        return  true;
    }复制代码

绑定ChexkBox的OnItemLongClick

@OnCheckedChanged(R.id.cb_cjeck)
    public void OnCheckedChanged(boolean isChecked){
        if(isChecked){
            GetToast.useString(getActivity(),"选中了");
            return ;
        }
        GetToast.useString(getActivity(),"没选中...");
    }复制代码

单个绑定onClick事件

@OnClick(R.id.f1)
    public void f1() {//动态添加Fragment
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        Fragment1 fragment1 = new Fragment1();
        //transaction.add(R.id.fragment_container, fragment1);
        transaction.replace(R.id.fragment_container,fragment1);
        transaction.commit();
    }

    @OnClick( R.id.f2 )
    public void f2(){
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        Fragment2 fragment2 = new Fragment2();
        transaction.replace(R.id.fragment_container,fragment2);
        //  transaction.add(R.id.fragment_container, fragment2);
        transaction.commit();
    }复制代码

项目地址:

github.com/androidstar…

更多文章

2017上半年技术文章集合—184篇文章分类汇总

那些年不容错过的智能刷新加载框

Android中自定义View坐标系那些事

NDK项目实战—高仿360手机助手之卸载监听

高级UI特效仿直播点赞效果—一个优美炫酷的点赞动画

Glide框架你这样玩过吗—基于Glide4.0的弱网下进度加载图片

一个实现录音和播放的小案例

相信本身,没有作不到的,只有想不到的

若是你以为此文对您有所帮助,微信公众号:终端研发部

技术+职场
技术+职场
相关文章
相关标签/搜索