来源:深圳沃龙软件开发公司 2017-04-06
工具片
高效开发的ButterKnife
Butterknife是JakeWharton大神写的一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,通过插件可视化一键生成。
先看一下Butterknife和传统的findViewById的区别
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... }}
通过@BindView方法和一个view的id 去自动绑定layout中的View,减少大量代码。
那么Butterknife是如何工作的呢?
可能很多人都觉得ButterKnife在bind(this)方法执行的时候通过反射获取ExampleActivity中所有的带有@Bind注解的属性并且获得注解中的R.id.xxx值,最后还是通过反射拿到Activity.findViewById()方法获取View,并赋值给ExampleActivity中的某个属性。这是一个注解库的实现方式,比较原始,一个很大的缺点就是在Activity运行时大量使用反射会影响App的运行性能,造成卡顿以及生成很多临时Java对象更容易触发GC。ButterKnife显然没有使用这种方式,它用了Java Annotation Processing技术,就是在Java代码编译成Java字节码的时候就已经处理了@Bind、@OnClick(ButterKnife还支持很多其他的注解)这些注解。
所以在性能方面完全和原始方法一样。
Butterknife很强大,他不仅可以通过@BindView来绑定View,还有@BindBool
, @BindColor
, @BindDimen
, @BindDrawable
, @BindInt
,@BindString来绑定你想绑定的res资源文件
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 // ...}
@OnClick( ) : 绑定控件点击事件
@OnClick(R.id.submit) public void submit(View view) { // TODO submit data to server... }
@OnClick( ) : 绑定控件多个view的点击事件
@OnClick({R.id.button1,R.id.button2,R.id.button3}) public void OnClick(View view) { switch(view.getId){ case R.id.button1: // TODO ... break; case R.id.button2: // TODO ... break; ... } }
还可以在fragment中使用
public class FancyFragment extends Fragment { @BindView(R.id.button1) Button button1; @BindView(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; }}
亦可在adapater中使用
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 { @BindView(R.id.title) TextView name; @BindView(R.id.job_title) TextView jobTitle; public ViewHolder(View view) { ButterKnife.bind(this, view); } }}
有关ButterKnife 的更多内容,请看github地址:https://github.com/JakeWharton/butterknife
使用 Android ButterKnife Zelezny 插件 可以一键生成@bindview
http://blog.csdn.net/dreamlivemeng/article/details/51261170
本内容皆为 深圳沃龙软件开发公司 原创
如需转载,请注明文章出处和来源网址:http://www.wooolong.com/blog/8.html
发表评论