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.设置
4.2.搜索
4.3.重启AndroidStudio 并使用 (鼠标定位到布局文件 Alt+Insert 出现下面)
4.4.点击 Generrate Butterknife Injections
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'
5.2.绑定方法
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.其他事件
注意1:OnItemClick item如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false。
注意2:
5.4.绑定资源
5.4.1.绑定字符串:@BindString()
1.数据来源:
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.结果:
注意:如果
@BindString(R.string.android_butterknife_String1)
private String string1;
@BindString(R.string.android_butterknife_String2)
private String string2;
即有private修饰符 报错
5.4.2.绑定数组:@BindArray()
1.数据来源:
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.数据来源:
2.代码:
@BindColor(R.color.colorPrimary)
int textviewcolor1;
@BindColor(R.color.colorAccent)
int textviewcolor2;
fragmentContent1Textview1.setTextColor(textviewcolor1);
fragmentContent1Textview2.setTextColor(textviewcolor2);
3.结果:
5.4.4.绑定Bitmap资源:@BindBitmap()
1.数据来源:
2.代码:
@BindView(R.id.fragment_content1_imageview1)
ImageView fragmentContent1Imageview1;
@BindBitmap(R.mipmap.ic_launcher)
Bitmap bitmap;
fragmentContent1Imageview1.setImageBitmap(bitmap);
3.结果:
5.4.5.其他资源