butter knife详解和使用

来源:互联网 发布:沈阳软件学院 编辑:程序博客网 时间:2024/05/17 18:00

1,butter knife 是什么?

 先上一发官方文档的介绍:Annotate fields with @BindView and a view ID for Butter Knife to find and automatically cast the corresponding view in your layout.

大概意思就是:使用butterknife和viewId字段在布局中找到,并且自动转换成你需要的view。

butterknife是一个相对容易的理解的注解框架,它主要是用来在开发过程中。布局中控件过多导致的findviewbyid和setlistener事件绑定的代码过多和冗余。使得开发效率提高代码也变得清晰容易阅读。(主要是用来给我们偷懒的 -_-)

下面是官方给的一个使用示例:

class ExampleActivity extends Activity {  @BindView(R.id.title) TextView title;  @BindView(R.id.subtitle) TextView subtitle;  @BindView(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...  }}

2,butter knife的主要作用

废话不多说上图

绑定监听事件

@OnClick(R.id.submit)public void submit(View view) {  // TODO submit data to server...}
bind color

@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();  }}

butter knife优势

1.强大的View绑定和Click事件处理功能,简化代码,提升开发效率

2.方便的处理Adapter里的ViewHolder绑定问题

3.运行时不会影响APP效率,使用配置方便

4.代码清晰,可读性强

-----------------------------------------------------------------

在使用中需要注意的事项


1.Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind

2.Fragment ButterKnife.bind(this, mRootView);

3.属性布局不能用private or static 修饰,否则会报错

4.setContentView()不能通过注解实现。(其他的有些注解框架可以)


3,Butter knife的使用步骤

1,依赖butterNife

eclipse直接去官网下载Jar包,  AS可以在File->Project Structure->Dependencies->Library dependency搜索添加即可。   直接compile 'com.jakewharton:butterknife:(insert latest version)'

2,具体的使用过程(借鉴http://blog.csdn.net/itjianghuxiaoxiong/article/details/50177549 尊重原创-_-)

(1)由于每次都要在Activity中的onCreate绑定Activity,所以个人建议写一个BaseActivity完成绑定,子类继承即可
     注:ButterKnife.bind(this);绑定Activity 必须在setContentView之后:
     实现如下(FragmentActivity 实现一样):

public abstract class BaseActivity extends Activity {      public abstract int getContentViewId();        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(getContentViewId());          ButterKnife.bind(this);          initAllMembersView(savedInstanceState);      }        protected abstract void initAllMembersView(Bundle savedInstanceState);        @Override      protected void onDestroy() {          super.onDestroy();          ButterKnife.unbind(this);//解除绑定,官方文档只对fragment做了解绑      }

(2) bind fragment

public abstract class BaseFragment extends Fragment {      public abstract int getContentViewId();      protected Context context;      protected View mRootView;        @Nullable      @Override      public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {          mRootView =inflater.inflate(getContentViewId(),container,false);          ButterKnife.bind(this,mRootView);//绑定framgent          this.context = getActivity();          initAllMembersView(savedInstanceState);          return mRootView;      }        protected abstract void initAllMembersView(Bundle savedInstanceState);        @Override      public void onDestroyView() {          super.onDestroyView();          ButterKnife.unbind(this);//解绑      }  }

(3),bind view

@Bind(R.id.hello_world)  TextView mHelloWorldTextView;  @Bind(R.id.app_name)  TextView mAppNameTextView;//view

(4)绑定资源

@BindString(R.string.app_name)  String appName;//sting  @BindColor(R.color.red)  int textColor;//颜色  @BindDrawable(R.mipmap.ic_launcher)  Drawable drawable;//drawble  @Bind(R.id.imageview)  ImageView mImageView;  @Bind(R.id.checkbox)  CheckBox mCheckBox;  @BindDrawable(R.drawable.selector_image)  Drawable selector;

(5)Adapter ViewHolder 绑定

public class TestAdapter extends BaseAdapter {      private List<String> list;      private Context context;        public TestAdapter(Context context, List<String> list) {          this.list = list;          this.context = context;      }        @Override      public int getCount() {          return list==null ? 0 : list.size();      }        @Override      public Object getItem(int position) {          return list.get(position);      }        @Override      public long getItemId(int position) {          return position;      }        @Override      public View getView(int position, View convertView, ViewGroup parent) {          ViewHolder holder;          if (convertView == null) {              convertView = LayoutInflater.from(context).inflate(R.layout.layout_list_item, null);              holder = new ViewHolder(convertView);              convertView.setTag(holder);          } else {              holder = (ViewHolder) convertView.getTag();          }          holder.textview.setText("item=====" + position);          return convertView;      }        static class ViewHolder {          @Bind(R.id.hello_world)          TextView textview;            public ViewHolder(View view) {              ButterKnife.bind(this, view);          }      }  }

还有多个view的统一绑定和点击事件的绑定就不在一一贴出代码了


最后给大家推荐一个特别好用的插件

Zelezny插件

在AndroidStudio->File->Settings->Plugins->搜索Zelezny下载添加就行 ,可以快速生成对应组件的实例对象,不用手动写。使用时,在要导入注解的Activity 或 Fragment 或 ViewHolder的layout资源代码上,右键——>Generate——Generate ButterKnife Injections,然后就出现如图的选择框。(此动态图来自官网)


0 0
原创粉丝点击