ButterKnife详解
2016-06-16 13:36
337 查看
关于ButterKnife在AndroidStudio中的使用请看2.0库的文章
下面我们来说ButterKnife的使用详解(个人的一些是使用,如有个别错误,欢迎指正)
ButterKnife官网
在Android编程过程中,我们会写大量的布局和点击事件,像初始view、设置view监听这样简单而重复的操作让人觉得麻烦类,所以可以采用注解的方式去实现,而ButterKnife则是注解中相对简单易懂的很不错的开源框架,而网上的文档和例子都过时了,7.0之后的版本改动很大,之前的注解都不能用了,所以借鉴官方文档总结了一下,接下来就介绍一下如何使用。基本参照官方文档,加上自己的心得。
ButterKnife 优势:
强大的View绑定和Click事件处理功能,简化代码,提升开发效率
方便的处理Adapter里的ViewHolder绑定问题
运行时不会影响APP效率,使用配置方便
代码清晰,可读性强
使用心得:
Activity :ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
Fragment :ButterKnife.bind(this, mRootView);
属性布局不能用private or static 修饰,否则会报错
setContentView()不能通过注解实现。
如果你是AndroidStudio,请参考2.0库中的文章
官网 和 github 也有相应的使用步骤
2.绑定fragment
3.绑定view
4.绑定资源
5.Adapter ViewHolder 绑定
6.点击事件的绑定:不用声明view,不用setOnClickLisener()就可以绑定点击事件
直接绑定一个方法
所有监听方法的参数是可选
定义一个特定类型,它将自动被转换
多个view统一处理同一个点击事件,很方便,避免抽方法重复调用的麻烦
自定义view可以绑定自己的监听,不指定id
7.对一组View进行统一操作
装入一个list
设置统一处理
统一操作处理,例如设置是否可点,属性等
下面我们来说ButterKnife的使用详解(个人的一些是使用,如有个别错误,欢迎指正)
ButterKnife官网
在Android编程过程中,我们会写大量的布局和点击事件,像初始view、设置view监听这样简单而重复的操作让人觉得麻烦类,所以可以采用注解的方式去实现,而ButterKnife则是注解中相对简单易懂的很不错的开源框架,而网上的文档和例子都过时了,7.0之后的版本改动很大,之前的注解都不能用了,所以借鉴官方文档总结了一下,接下来就介绍一下如何使用。基本参照官方文档,加上自己的心得。
ButterKnife 优势:
强大的View绑定和Click事件处理功能,简化代码,提升开发效率
方便的处理Adapter里的ViewHolder绑定问题
运行时不会影响APP效率,使用配置方便
代码清晰,可读性强
使用心得:
Activity :ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
Fragment :ButterKnife.bind(this, mRootView);
属性布局不能用private or static 修饰,否则会报错
setContentView()不能通过注解实现。
详解
一.导入ButterKnife jar包:
如果你是Eclipse,可以去官网下载jar包如果你是AndroidStudio,请参考2.0库中的文章
官网 和 github 也有相应的使用步骤
二.常见使用方法:
1.由于每次都要在Activity中的onCreate绑定Activity,所以个人建议写一个BaseActivity完成绑定,子类继承即可public abstract class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentViewId()); ButterKnife.bind(this); initAllMembersView(savedInstanceState); } }
2.绑定fragment
public abstract class BaseFragment extends Fragment { 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; } }
3.绑定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 @BindView(R.id.imageview) ImageView mImageView; @BindView(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 { @BindView(R.id.hello_world) TextView textview; public ViewHolder(View view) { ButterKnife.bind(this, view); } } }
6.点击事件的绑定:不用声明view,不用setOnClickLisener()就可以绑定点击事件
直接绑定一个方法
@OnClick(R.id.submit) public void submit(View view) { // TODO submit data to server... }
所有监听方法的参数是可选
@OnClick(R.id.submit) public void submit() { // TODO submit data to server... }
定义一个特定类型,它将自动被转换
@OnClick(R.id.submit) public void sayHi(Button button) { button.setText("Hello!"); }
多个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(); } }
自定义view可以绑定自己的监听,不指定id
public class FancyButton extends Button { @OnClick public void onClick() { // TODO do something! } }
7.对一组View进行统一操作
装入一个list
@Bind({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<EditText> nameViews;
设置统一处理
static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() { @Override public void apply(View view, int index) { view.setEnabled(false); } }; static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() { @Override public void set(View view, Boolean value, int index) { view.setEnabled(value); } };
统一操作处理,例如设置是否可点,属性等
ButterKnife.apply(nameViews, DISABLE); ButterKnife.apply(nameViews, ENABLED, false);
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories