ButterKnife 可以省去很多的findViewById 代码
GitHub地址:https://github.com/JakeWharton/butterknife
在 Android Studio 中的配置
dependencies {
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
到此配置已完成,
Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
Fragment ButterKnife.bind(this, mRootView);
属性布局不能用private or static 修饰,否则会报错 @BindView fields must not be private or static.
在Activity中绑定使用
public class LoginActivity extends AppCompatActivity{
@BindView(R.id.email)
public AutoCompleteTextView mEmailView;
@BindView(R.id.password)
public EditText mPasswordView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
}
}
在Fragment中使用
public class ButterknifeFragment extends Fragment{
private Unbinder unbinder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
//返回一个Unbinder值(进行解绑),注意这里的this不能使用getActivity()
unbinder = ButterKnife.bind(this, view);
return view;
}
/**
* onDestroyView中进行解绑操作
*/
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
在Adapter 中使用
public class DemoListAdapter extends BaseAdapter {
public DemoListAdapter() {
super();
}
@Override
public View getView(int index, View convertView, ViewGroup parent) {
MyViewHolder myViewHolder ;
if (convertView == null) {
convertView = View.inflate(getActivity(), R.layout.list_info_item, null);
myViewHolder= new MyViewHolder(convertView);
convertView.setTag(myViewHolder);
}else {
myViewHolder = (MyViewHolder) convertView.getTag();
}
myViewHolder.title.setText(DEMOS[index].title);
myViewHolder.desc.setText(DEMOS[index].desc);
return convertView;
}
@Override
public int getCount() {
return DEMOS.length;
}
@Override
public Object getItem(int index) {
return DEMOS[index];
}
@Override
public long getItemId(int id) {
return id;
}
class MyViewHolder {
@BindView(R.id.title) TextView title;
@BindView(R.id.desc) TextView desc;
public MyViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
绑定监听事件
@OnClick(R.id.email_sign_in_button)
public void attemptLogin() {
}
绑定多个监听事件
@OnClick({R.id.button1 , R.id.button2, R.id.button3})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.button1:
break;
case R.id.button2:
break;
case R.id.button3:
break;
}
}
绑定事件使用R2的绑定id
这个没有验证出来,我使用的是最新的,但是没有R2 这个东西,记录说是8.7.0 之后就有的,有待我再来确认
@BindView
@BindView(R.id.tv_html)
public TextView tv_html ;
@BindViews
错误提示 @BindViews must be a List or array
@BindViews({R.id.button1 , R.id.button2})
public List
@BindArray 绑定string里面array数组;@BindArray(R.array.city ) String[] citys ;
@BindBitmap 绑定图片资源为Bitmap;@BindBitmap( R.mipmap.wifi ) Bitmap bitmap;
@BindString 绑定一个String id为一个String变量;@BindString( R.string.app_name ) String meg;
@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
@BindBool 绑定boolean值
ButterKnife的代码混淆
在混淆文件中,添加如下代码:
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* ;
}
-keepclasseswithmembernames class * {
@butterknife.* ;
}
安装插件
安装完插件后重启
插件的使用
1. 将光标放在layout布局文件名字上
2.鼠标右边选择Generate 菜单
3.选择Generate Butterknife Injections 菜单
如果没有出现这个菜单就是光标选择位置不对,需要放在布局文件名字上
4. 根据需要选择相应的配置
5. 下面是自动生成的代码
在ondestroyview中我使用的是fragment 会出现一个unbind 方法,需要解除绑定