ButterKnife框架的使用

先介绍一个有用的插件“Android ButterKnife Zelezny”,注意,这个插件必须添加compile 'com.jakewharton:butterknife:8.8.1'依赖才可以使用,这个插件可以自动生成ButterKnife代码,具体的步骤是:点击一个MainActivity.class中的布局文件,即R.layout.activity_main中的activity_main,然后点击code--generate--generate butterknifeinjections,即可选择要生成的view代码,当项目不让使用butterknife的时候,我们只需点击edit--removebutterknife即可,系统会自动移除bind注解,自动生成findViewById代码,但是删不了onclick注解。

首先在project的build.gradle中添加如下依赖

dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}

然后在module的build.gradle中添加如下依赖(如果不能触发事件的话,再加上annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'试试)

apply plugin: 'com.neenbedankt.android-apt'
...
compile 'com.jakewharton:butterknife:8.8.1'
apt 'com.jakewharton:butterknife-compiler:8.8.1'

开始写代码

1:最基本的用法,在activity中的用法(以下的butterknife代码可以通过上面介绍的插件快速生成)

public class FourthActivity extends AppCompatActivity {

    @BindView(R.id.textView)
    TextView textView;
    @BindView(R.id.textView1)
    TextView textView1;
    @BindView(R.id.textView2)
    TextView textView2;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fourth);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.textView, R.id.textView1, R.id.textView2})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.textView:
                Toast.makeText(this, "view.getId():" + view.getId(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.textView1:
                Toast.makeText(this, "view.getId():" + view.getId(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.textView2:
                Toast.makeText(this, "view.getId():" + view.getId(), Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

fragment中代码示例:

public class MyFragment extends Fragment {
    @BindView(R.id.textView)
    TextView textView;
    @BindView(R.id.textView1)
    TextView textView1;
    @BindView(R.id.textView2)
    TextView textView2;
    Unbinder unbinder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, null, false);
        unbinder = ButterKnife.bind(this, view);
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }

    @OnClick({R.id.textView, R.id.textView1, R.id.textView2})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.textView:
                break;
            case R.id.textView1:
                break;
            case R.id.textView2:
                break;
        }
    }
}

2:方法中传入参数

可以在自己写的方法中传入参数,这个参数就对应着所对应的视图

@OnTouch(R.id.textView2)
    public boolean jjj(TextView textView) {
        Toast.makeText(this, "触碰到了"+textView.getText(), Toast.LENGTH_SHORT).show();
        return true;
    }

并且,括号中的参数只要是对应视图的父类就行,框架会进行自动转换
比如,在xml文件中

 

在java文件中

 @OnTouch(R.id.textView2)
    public boolean jjj(TextView textView) {//在这里是以TextView的形式来接收的,然后框架进行自动转换,TextView是

Button的父类
        Toast.makeText(this, "触碰到了"+textView.getText(), Toast.LENGTH_SHORT).show();
        return true;
    }

另外还有一点,就是如果不用一个视图的引用的话,那么就可以不用@BindView来进行引用绑定
比如

 /* @BindView(R.id.textView2)
    TextView textView2;*/

▲ 更多绑定注解:
@BindView---->绑定一个view;id为一个view 变量
@BindViews ----> 绑定多个view;id为一个view的list变量
@BindArray----> 绑定string里面array数组;@BindArray(R.array.city ) String[] citys ;
@BindBitmap---->绑定图片资源为Bitmap;@BindBitmap(R.mipmap.wifi ) Bitmap bitmap;
@BindBool ---->绑定boolean值
@BindColor ---->绑定color;
@BindColor(R.color.colorAccent) int black;
@BindDimen ---->绑定Dimen;@BindDimen(R.dimen.borth_width) int mBorderWidth;
@BindDrawable ----> 绑定Drawable;@BindDrawable(R.drawable.test_pic) Drawable mTestPic;
@BindFloat ---->绑定float
@BindInt ---->绑定int
@BindString ---->绑定一个String id为一个String变量;@BindString( R.string.app_name ) String meg;
▲ 更多事件注解:
@OnClick---->点击事件
@OnCheckedChanged ---->选中,取消选中
@OnEditorAction ---->软键盘的功能键
@OnFocusChange ---->焦点改变
@OnItemClick item---->被点击(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)
@OnItemLongClick item---->长按(返回真可以拦截onItemClick)
@OnItemSelected ---->item被选择事件
@OnLongClick ---->长按事件
@OnPageChange ---->页面改变事件
@OnTextChanged ---->EditText里面的文本变化事件
@OnTouch ---->触摸事件
@Optional ---->选择性注入,如果当前对象不存在,就会抛出一个异常,为了压制这个异常,可以在变量或者方法上加入一下注解,让注入变成选择性的,如果目标View存在,则注入, 不存在,则什么事情都不做

ButterKnife使用心得与注意事项:

1、在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。
2、在非Activity 类(eg:Fragment、ViewHold)中绑定:ButterKnife.bind(this,view);这里的this不能替换成getActivity
()。
3、在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。
4、使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。错误: @BindView fields must not be private or static.
5、setContentView()不能通过注解实现。(其他的有些注解框架可以)

注意事项:自己所定义的方法中的参数要和原来监听器中方法的参数的类型和个数要一样才行

另外用ButterKnife框架时,不管是变量还是方法都不能用private修饰,不然会报错

参考博客:

https://www.jianshu.com/p/2967d0342d80
https://blog.csdn.net/niubitianping/article/details/54893571
https://www.jianshu.com/p/85cf4b9b34cd

你可能感兴趣的:(ButterKnife框架的使用)