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<Button> btnList ;
@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.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
安裝插件
安裝完插件後重啓
插件的使用
1. 將光標放在layout佈局文件名字上
2.鼠標右邊選擇Generate 菜單
3.選擇Generate Butterknife Injections 菜單
如果沒有出現這個菜單就是光標選擇位置不對,需要放在佈局文件名字上
4. 根據需要選擇相應的配置
5. 下面是自動生成的代碼
在ondestroyview中我使用的是fragment 會出現一個unbind 方法,需要解除綁定