Android ButterKnife框架的使用

摘要

在进行Android开发的时候,我们常常使用findViewById() 的方法来引入控件的对象,当需要引入多个对象的时候,使用findViewById() 的方法将会影响我们的开发的速度。所以使用框架来引入控件对象将会变得更加方便。常用的引入框架有两个:ButterKnife 和 AndroidAnnotations 。这里主要介绍ButterKnife的使用。

ButterKnife 功能

(1)绑定控件(Activity、Fragment 和 ViewHolder)
(2)绑定点击事件
(3)绑定资源(颜色、字符串、尺寸、图片…)
(4)定义行为,批量修改控件

ButterKnife在Android Studio工程中的使用方法

1.引入ButterKnife (也可以参考 https://github.com/JakeWharton/butterknife)

(1)首先在project层的gradle 中加入红色框那一句:

这里写图片描述

(2)在app 层的gradle 中加入红框中的内容:

这里写图片描述

(3)点击同步工程。待工程同步完成,ButterKnife 算引入成功了,我们就可以使用ButterKnife中的API进行开发。

2. 在Activity 中绑定控件和资源

ButterKnife 利用的是java的反射机制,所以在绑定控件的时候,需要进行初始化,如:

ButterKnife.bind(this); // BUtterKnife的初始化操作,this指代Activity对象

(1) 绑定控件

//绑定一个TextView,作用等同于TextView textView = (TextView) findViewById(R.id.tv);
    @BindView(R.id.tv) TextView tv;

(2)在Activity绑定单个资源

绑定颜色资源

 //绑定res文件夹中的资源,作用等同于getResources().getColor(R.color.colorAccent,Color.BLUE)
    @BindColor(R.color.colorAccent)
    int color;

绑定字符串资源:

  //绑定字符资源,作用等同于getResources().getString()
    @BindString(R.string.app_name)
    String appName;

绑定图片资源

 //绑定图片资源,作用等同于getResources().getDrawable()
    @BindDrawable(R.mipmap.ic_launcher)
    Drawable drawable;

绑定尺寸资源

 @BindDimen(R.dimen.spacer) Float spacer;   //int (for pixel size) or float

当然还可以绑定其它资源,这里不一一罗列了。

(3)绑定多个控件和资源

只需要在把控件的id 使用数组列出来,@BindView 改为 @BindViews即可,如:

//批量绑定控件
    @BindViews({R.id.tv1, R.id.tv2, R.id.tv3})
    List<TextView> textViews;

3.绑定点击事件

注意:方法名btnClick可以随便取,方法参数 Button btn 也可以任意类型。

//绑定点击事件
    @OnClick({R.id.btn1, R.id.btn2})  // 如果只是绑定一个点击事件@OnClick(R.id.btn1)
    public void btnClick(Button btn) {
        switch (btn.getId()) {
            case R.id.btn1:
                Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn2:
                Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show();
                break;
        }
    }

4. 绑定适配器 Adapter 里面的控件

在使用ListView 来加载数据的时候,往往需要自定义适配器,在自定义的item布局中也可以使用ButterKnife来对控件进行绑定。

          //  convertView = inflater.inflate(R.layout.item, parent, false);
          //  holder = new ViewHolder(convertView);

class ViewHolder {
        @BindView(R.id.tv) TextView tv;
        public ViewHolder(View itemView) {
            //第二个参数表示去哪一个布局文件中查找对应的控件
            ButterKnife.bind(this,itemView);
        }
    }

需要注意的是,初始化ButterKnife的时候需要加上View。

5. 绑定Fragment 里面的控件和点击事件

初始化:

// View view = inflater.inflate(R.layout.fg_layout, container, false);
        ButterKnife.bind(this, view);

绑定控件和点击事件:

// 绑定 TextView
@BindView(R.id.tv)
    TextView tv;

//绑定点击事件
@OnClick(R.id.fg_btn)
    public void fgBtnClick(View view) {
        Toast.makeText(getActivity(), "tttttt", Toast.LENGTH_SHORT).show();
    }

6. Android ButterKnife Zelezny(直接在as插件中搜索)

这是ButterKnife的一款插件,可以快速绑定地控件。安装完成即可使用。

这里写图片描述

使用方法:

这里写图片描述

选择需要绑定的控件,然后点击Confirm即可。如下:

这里写图片描述

引入效果如下:

    @BindView(R.id.btn1) Button btn1;
    @BindView(R.id.btn2) Button btn2;
    @BindView(R.id.btn3) Button btn3;
    @BindView(R.id.btn4) Button btn4;
    @BindView(R.id.tv1) TextView tv1;
    @BindView(R.id.et1) EditText et1;

7.快速地给多个控件添加行为,如TextView修改文字大小,颜色等

(1) 首先绑定需要修改的多个控件:

//批量初始化控件
    @BindViews({R.id.tv1, R.id.tv2, R.id.tv3})
    List<TextView> textViews;

(2)定义修改文字大小的行为

 //定义一个修改文本大小的行为
        ButterKnife.Action<TextView> CHANGETEXTSIZE = new ButterKnife.Action<TextView>() {
            @Override
            public void apply(@NonNull TextView view, int index) {
   
   // index代表第几个控件
                view.setTextSize(36);
            }
        };

(3)定义修改颜色的行为

//定义一个可传参的行为,其中List<Integer> 放置的是颜色的集合
        ButterKnife.Setter<TextView,List<Integer>> CHANGETEXTCOLOR = new ButterKnife.Setter<TextView, List<Integer>>() {
            @Override
            public void set(@NonNull TextView view, List<Integer> value, int index) {
                view.setTextColor(value.get(index));
            }
        };

(4)应用所定义的行为

// 应用修改文字大小的行为
ButterKnife.apply(textViews,CHANGETEXTSIZE);
// 应用修改颜色的行为
ButterKnife.apply(textViews,CHANGETEXTCOLOR,textColors);

猜你喜欢

转载自blog.csdn.net/LewisWang_/article/details/52904626