ButterKnife初级用法

来源:互联网 发布:linux创建多个定时器 编辑:程序博客网 时间:2024/05/29 17:31

ButterKnife是为Android提供的注解式框架,可以简化代码的编写,比如:

class ExampleActivity extends Activity {  TextView title;  TextView subtitle;  TextView footer;  @Override public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.simple_activity);    title = (TextView) findViewById(R.id.title);    subtitle = (TextView) findViewById(R.id.subtitle);    footer = (TextView) findViewById(R.id.footer);    // TODO Use views...  }}

如果用框架写的话,则变为:

class ExampleActivity extends Activity {  @Bind(R.id.title) TextView title;  @Bind(R.id.subtitle) TextView subtitle;  @Bind(R.id.footer) TextView footer;  @Override public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.simple_activity);    ButterKnife.bind(this);    // TODO Use fields...  }
从这个例子也可以看出在一个activity中如何完成控件的绑定,首先bind方法是必须的,然后用@Bind可以完成各个控件的绑定,在AS中可以直接用插件生成,非常方便

下面是资源文件的绑定:

class ExampleActivity extends Activity {  @BindString(R.string.title) String title;  @BindDrawable(R.drawable.graphic) Drawable graphic;  @BindColor(R.color.red) int red; // int or ColorStateList field  @BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field  // ...}
如果不是在一个Activity中,框架的用法有小小的区别:

public class FancyFragment extends Fragment {  @Bind(R.id.button1) Button button1;  @Bind(R.id.button2) Button button2;  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    View view = inflater.inflate(R.layout.fancy_fragment, container, false);    ButterKnife.bind(this, view);    // TODO Use fields...    return view;  }}
在优化ListView时经常在adapter用到ViewHolder,对该类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.whatever, parent, false);      holder = new ViewHolder(view);      view.setTag(holder);    }    holder.name.setText("John Doe");    // etc...    return view;  }  static class ViewHolder {    @Bind(R.id.title) TextView name;    @Bind(R.id.job_title) TextView jobTitle;    public ViewHolder(View view) {      ButterKnife.bind(this, view);    }  }}
给监听器注入:

@OnClick(R.id.submit)public void submit(View view) {  // TODO submit data to server...}
参数view有没有都无所谓,

当然,也可以为多个控件设置监听器注入:

@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();  }}
方法中也可以根据id不同来设置不同监听事件

由于Fragment与Activity有不同的生命周期,如果要绑定一个Fragment在onCreateView方法中时,需要将试图设置为空在onDestroy的时候,用unbind方法即可

public class FancyFragment extends Fragment {  @Bind(R.id.button1) Button button1;  @Bind(R.id.button2) Button button2;  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    View view = inflater.inflate(R.layout.fancy_fragment, container, false);    ButterKnife.bind(this, view);    // TODO Use fields...    return view;  }  @Override public void onDestroyView() {    super.onDestroyView();    ButterKnife.unbind(this);  }}








0 0
原创粉丝点击