Android 依赖注入库之ButterKnife

1.ButterKnife简介

ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。目前使用很广。

最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。(xUtils的注入都是运行时反射,对性能影响很大)






2.ButterKnife优点


2.1.强大的View绑定和Click事件处理功能,简化代码,提升开发效率。


2.2.方便的处理Adapter里的ViewHolder绑定问题。


2.3.运行时不会影响APP效率,使用配置方便。


2.4.代码清晰,可读性强。






3.ButterKnife使用注意事项


3.1.在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。


3.2.在非Activity 类(Fragment,ViewHold)中绑定: ButterKnife.bind(this,view);这里的this不能替换成getActivity()。


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


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


3.5.setContentView()不能通过注解实现。(其他的有些注解框架可以)


3.6.使用Activity为根视图绑定任意对象时,如果你使用类似MVC的设计模式你可以在Activity 调用ButterKnife.bind(this, activity),来绑定Controller。


3.7.使用ButterKnife.bind(this,view)绑定一个view的子节点字段。如果你在子View的布局里或者自定义view的构造方法里 使用了inflate,你可以立刻调用此方法。或者,从XML inflate来的自定义view类型可以在onFinishInflate回调方法中使用它。






4.AndroidStudio中配置ButterKnife插件


4.1.设置

Android 依赖注入库之ButterKnife_第1张图片


4.2.搜索

Android 依赖注入库之ButterKnife_第2张图片


4.3.重启AndroidStudio 并使用 (鼠标定位到布局文件 Alt+Insert 出现下面)

Android 依赖注入库之ButterKnife_第3张图片


4.4.点击 Generrate Butterknife Injections

Android 依赖注入库之ButterKnife_第4张图片







5.代码说明


5.1.在AndroidStudio中配置

implementation 'com.jakewharton:butterknife:8.8.1'



如果这样配置 View的点击事件可能会没有效果


修改

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
Android 依赖注入库之ButterKnife_第5张图片



5.2.绑定方法

Android 依赖注入库之ButterKnife_第6张图片


5.2.1.Activity中绑定ButterKnife:ButterKnife.bind(this);

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);
        //绑定初始化ButterKnife
        ButterKnife.bind(this);
        onWindowbar();
        initView();
    }

即在Activity中的onCreate绑定Activity,也可以写一个父类绑定然后子类继承即可。绑定Activity 必须在setContentView之后。使用ButterKnife.bind(this)进行绑定。





5.2.2.Fragment中绑定ButterKnife:ButterKnife.bind(this,view);

绑定:

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

解绑:

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





5.2.3.Adapter的ViewHolder中绑定

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.listview_item, null);
            viewHolder=new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.listviewItemTextview.setText("姓名:" + list.get(position).getName() + " 年龄:" + list.get(position).getAge() + "岁 性别:" + list.get(position).getSex());
        return convertView;
    }

static class ViewHolder {
        @BindView(R.id.listview_item_textview)
        TextView listviewItemTextview;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }



5.3.各种事件方法(View点击事件,ListView点击事件,长按事件...)


5.3.1.View点击事件

 @BindView(R.id.fragment_content1_textview1)
 TextView fragmentContent1Textview1;
 @BindView(R.id.fragment_content1_textview2)
 TextView fragmentContent1Textview2;
 private Unbinder unbinder=null;


@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_content1, container, false);
        unbinder=ButterKnife.bind(this, view);
        Log.d("TAG", "onCreateView方法!!!333");
        return view;
    }

@OnClick({R.id.fragment_content1_textview1, R.id.fragment_content1_textview2})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.fragment_content1_textview1:
                intent=new Intent(getActivity(), WebViewActivity.class);
                intent.putExtra("url",url);
                startActivity(intent);
                break;
            case R.id.fragment_content1_textview2:
                intent=new Intent(getActivity(), ListViewActivity.class);
                startActivity(intent);
                break;
        }
    }
@Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }


5.3.2.ListView点击事件以及长按事件


 @BindView(R.id.activity_listview_listview)
 ListView activityListviewListview;
 private ListViewAdapter adapter;
 private List list;


ButterKnife.bind(this);

/**
     * ListView 点击事件
     * */

    @OnItemClick(R.id.activity_listview_listview)
    public void onItemClick(int position){
        String name="点击:"+list.get(position).getName();
        Toast.makeText(ListViewActivity.this,name,Toast.LENGTH_LONG).show();
    }


    /**
     * ListView 长按事件
     * */

    @OnItemLongClick(R.id.activity_listview_listview)
    public boolean OnItemLongClick(int position){
        String name="长按:"+list.get(position).getName();
        Toast.makeText(ListViewActivity.this,name,Toast.LENGTH_LONG).show();
        return true;
    }


5.3.3.其他事件

Android 依赖注入库之ButterKnife_第7张图片



注意1:OnItemClick item如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false。


注意2:

Android 依赖注入库之ButterKnife_第8张图片



5.4.绑定资源


5.4.1.绑定字符串:@BindString()


1.数据来源:

Android 依赖注入库之ButterKnife_第9张图片


2.代码:

 @BindString(R.string.android_butterknife_String1)
 String string1;
 @BindString(R.string.android_butterknife_String2)
 String string2;


unbinder=ButterKnife.bind(this, view);
fragmentContent1Textview1.setText(string1);
fragmentContent1Textview2.setText(string2);


3.结果:

Android 依赖注入库之ButterKnife_第10张图片


注意:如果

@BindString(R.string.android_butterknife_String1)
private String string1;
@BindString(R.string.android_butterknife_String2)
private String string2;

即有private修饰符 报错




5.4.2.绑定数组:@BindArray()


1.数据来源:

Android 依赖注入库之ButterKnife_第11张图片


2.代码:

@BindArray(R.array.fruit)
String fruit[];
int length=fruit.length;
for(int i=0;i

3.结果:

result----:苹果
result----:香蕉
result----:提子
result----:榴莲
result----:哈密瓜



5.4.3.绑定颜色值:@BindColor()


1.数据来源:

Android 依赖注入库之ButterKnife_第12张图片


2.代码:

 @BindColor(R.color.colorPrimary)
 int textviewcolor1;
 @BindColor(R.color.colorAccent)
 int textviewcolor2;
fragmentContent1Textview1.setTextColor(textviewcolor1);
fragmentContent1Textview2.setTextColor(textviewcolor2);

3.结果:

Android 依赖注入库之ButterKnife_第13张图片




5.4.4.绑定Bitmap资源:@BindBitmap()


1.数据来源:

Android 依赖注入库之ButterKnife_第14张图片


2.代码:

@BindView(R.id.fragment_content1_imageview1)
ImageView fragmentContent1Imageview1;

@BindBitmap(R.mipmap.ic_launcher)
Bitmap bitmap;
fragmentContent1Imageview1.setImageBitmap(bitmap);


3.结果:

Android 依赖注入库之ButterKnife_第15张图片


5.4.5.其他资源

Android 依赖注入库之ButterKnife_第16张图片

Android 依赖注入库之ButterKnife_第17张图片



你可能感兴趣的:(Android,依赖注入库)