Butter Knife:Android的字段和方法绑定视图使用注解处理为您生成样板代码。
写这篇blog的时候我用的是Butter Knife5.1.1版本,现在最新的Butter Knife应该是6.1.0版本。推荐大家下载6.1.0的JAR。
Activity中使用:
第一步:将依赖包导入Dependencies中
build.gradle中
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.jakewharton:butterknife:5.1.1'
}
第二步,布局activity_main.xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">
<TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="ButterKnife模拟用户登录界面" android:textSize="22sp" android:layout_centerHorizontal="true" android:gravity="center" android:layout_marginTop="72dp"/>
<EditText android:id="@+id/et_name" android:hint="请输入用户名" android:layout_below="@id/tv_title" android:layout_marginTop="50dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="6dp" />
<EditText android:id="@+id/et_pwd" android:hint="请输入密码" android:layout_below="@id/et_name" android:layout_marginTop="50dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="6dp" />
<Button android:id="@+id/btn_submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SUBMIT" android:layout_below="@id/et_pwd" android:layout_centerHorizontal="true" android:layout_marginTop="50dp"/>
</RelativeLayout>
第三步:MainActivit中,使用注解
public class MainActivity extends Activity {
@InjectView(R.id.et_name) EditText nameEditText;
@InjectView(R.id.et_pwd) EditText pwdEditText;
@OnClick(R.id.btn_submit) void submmit(){
if(nameEditText.getText().toString().equals("420733721") && pwdEditText.getText().toString().equals("123456")){
Toast.makeText(MainActivity.this,getString(R.string.login_sucess),Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MainActivity.this,getString(R.string.login_faild),Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化ButterKnife
ButterKnife.inject(this);
}
}
Fragment中使用
public class AFragment extends Fragment {
@InjectView(R.id.tv_f)
TextView textView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.f_a,container,false);
ButterKnife.inject(this,view);
textView.setText("This is Fragment A !");
return view;
}
}
Adapter中的使用
/** * 适配器 */
public class MyAdapter extends BaseAdapter{
private Context mContext;
private String[] strings;
private LayoutInflater mInflater;
public MyAdapter(String[] strings, Context mContext) {
this.strings = strings;
this.mContext = mContext;
mInflater=LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return str.length;
}
@Override
public Object getItem(int i) {
return str[i];
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if(view==null){
view=mInflater.inflate(R.layout.item_list,viewGroup,false);
holder=new ViewHolder(view);
view.setTag(holder);
}else {
holder= (ViewHolder) view.getTag();
}
holder.itemTextView.setText(strings[i]);
return view;
}
class ViewHolder{
@InjectView(R.id.item_tv)
TextView itemTextView;
public ViewHolder(View view){
ButterKnife.inject(this,view);
}
}
}
总结:
事件注入
点击事件注入
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
多个控件具有相同的事件
@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(DoorView door) {
if (door.hasPrizeBehind()) {
Toast.makeText(this, "You win!", LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Try again", LENGTH_SHORT).show();
}
}
重置注入
public class FancyFragment extends Fragment {
@InjectView(R.id.button1) Button button1;
@InjectView(R.id.button2) Button button2;
@Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
ButterKnife.inject(this, view);
// TODO Use "injected" views...
return view;
}
@Override void onDestroyView() {
super.onDestroyView();
ButterKnife.reset(this);
}
}
可选注入
默认情况下@InjectView和@OnClick注入是必选的,如果view未找到将出现异常。为了避免出现异常,添加一个@Optional注解
其它
ButterKnife还包含了两个findById方法。
View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);
混淆
为避免混淆的时代码被移除,所以要在proguard-project.txt中添加如下代码避免混淆
-dontwarn butterknife.internal.** -keep class **$$ViewInjector { *; } -keepnames class * { @butterknife.InjectView *;}