快捷、方面、好用!令人超赞的ButterKnife8.8.1

ButterKnife8.8.1的用法

什么是ButterKnife

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

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

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()不能通过注解实现。(其他的有些注解框架可以)

使用方法

  • 导入

    导入.png
    gradle中需要进行导入

  • 一键生成资源id

    一键生成资源id.gif

英文使用说明地址:http://jakewharton.github.io/butterknife/

API文档地址:
http://jakewharton.github.io/butterknife/javadoc/

GitHub源码地址:
https://github.com/JakeWharton/butterknife

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

测试效果如下

butterKnife8.8.1Framgment测试
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();
    }

项目地址:

https://github.com/androidstarjack/EventBusTestSimple

更多文章

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

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

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

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

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

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

相信自己,没有做不到的,只有想不到的

加入大牛圈

如果你觉得此文对您有所帮助 微信公众号:终端研发部

技术+职场

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

androidstarjack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值