一、ButterKnife(代码注入框架)的注册与绑定
在Activity中绑定 :ButterKnife.bind(this)必须在setContentView之后绑定,且父类bind绑定后,子类不需要再bind
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定初始化ButterKnife
ButterKnife.bind(this);
}
}
在非Activity(Fragment、ViewHold)中绑定: ButterKnife.bind(this,view),这里的this不能替换成getActivity
在Activity中不需要做解绑操作,在Fragment中必须在onDestroyView中做解绑操作
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中绑定ButterKnife
public class MyAdapter extends BaseAdapter {
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.testlayout, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
}
holder.name.setText("Donkor");
holder.job.setText("Android");
return view;
}
static class ViewHolder {
@BindView(R.id.title)
TextView name;
@BindView(R.id.job)
TextView job;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
使用ButterKnife修饰的方法和控件,不能用private(如果是private,那么只能通过反射获取,影响性能)、static修饰,否则会报错
setContentView()不能通过注解实现
二、ButterKnife的基本使用
View绑定:
@BindView(R2.id.button)
public Button button;
多个View绑定:
public class MainActivity extends AppCompatActivity {
@BindViews({R2.id.button1, R2.id.button2, R2.id.button3})
public List
资源绑定:
绑定String字符串:@BindString( )
绑定string-array数组:@BindArray( )
城市
- 北京市
- 天津市
- 哈尔滨市
- 大连市
- 香港市
public class MainActivity extends AppCompatActivity {
@BindView(R2.id.button)//绑定Button控件
public Button button;
@BindString(R2.string.app_name)//绑定资源文件中String字符串
String str;
@BindArray(R2.array.city) //绑定string-array数组
String[] citys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定activity
ButterKnife.bind(this);
button.setText(citys[0]);
}
}
绑定Bitmap资源:@BindBitmap( )
绑定颜色值:@BindColor( )
事件绑定:
public class MainActivity extends AppCompatActivity {
@OnClick(R2.id.button1)
public void showToast() {
Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();
}
@OnLongClick(R2.id.button1)
public boolean showToast2() {
Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show();
return true;
}
@OnClick({R.id.ll_product_name, R.id.ll_product_lilv,
R.id.ll_product_qixian, R.id.ll_product_repayment_methods})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.ll_product_name:
System.out.print("我是点击事件1");
break;
case R.id.ll_product_lilv:
System.out.print("我是点击事件2");
break;
case R.id.ll_product_qixian:
System.out.print("我是点击事件3");
break;
case R.id.ll_product_repayment_methods:
System.out.print("我是点击事件4");
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定activity
ButterKnife.bind(this);
}
}
另外,ButterKnife在使用时需要设置混淆规则
三、ButterKnife原理:编译期注解处理、代码生成工具
R和R2的区别:R.java中声明的变量不是常量,那我们就copy一份R.java,搞个R2.java,然后把所有变量都加上final关键字,然后相关地方直接引用R2不就得了咯