Android ButterKnife
2016-04-18 11:39
531 查看
Butter Knife介绍
【准备工作】Android Studio中使用只需要在Gradle中配置:
compile 'com.jakewharton:butterknife:7.0.1'
同时还可以安装AS插件:Android ButterKnife Zelezny
两者都配置好后,只需要以下两步就可以轻松搞定:
(1)代码中将光标定格在布局文件上。
(2) 右键 Generate -> Generate Butterknife Injections。
1.ButterKnife中,在你的View或布局上使用注释@Bind来标示,它会自动将ID字段和View进行绑定。
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... } }
它将会代替慢反射,生成的代码可以使用视图进行查找。你可以查看和调试在使用了bind方法所生成的代码。
对于上面的例子中生成的代码大致如下所示:
public void bind(ExampleActivity activity) { activity.subtitle = (android.widget.TextView) activity.findViewById(2130968578); activity.footer = (android.widget.TextView) activity.findViewById(2130968579); activity.title = (android.widget.TextView) activity.findViewById(2130968577); }
2.非行为约束
你也可以执行任意对象结合并将其绑定在一起。
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; } }
3.另一个用途是简化适配器列表里面的ViewHolder的绑定:
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); } } }
从上面的例子中你可以看到代码是如何实现的。
使用ButterKnife的bind可以将任何findViewById的代码进行简化,使用bind来绑定。
4.其他提供绑定API:
使用活动为视图根绑定任意对象。如果你使用的模式像MVC你可以利用其活性ButterKnife.bind(这一点,活动)绑定控制器。
绑定视图的子View尽量使用ButterKnife.bind方法。如果您使用在布局<合并>标记和自定义视图构造也可以后立即调用它。或者,当自定义的View视图在onFinishInflate()回调后使用bind进行绑定。
5.你可以将多个View视图绑定到一个列表集合或数组里面:
@Bind({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<EditText> nameViews;
使用apply方法可以对集合中的View进行统一管理,例如:
ButterKnife.apply(nameViews, DISABLE); ButterKnife.apply(nameViews, ENABLED, false);
即对nameViews集合中的View设置DISABLE护着ENABLED等操作。
Action和Setter接口允许你指定简单的行为方式:
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); } };
从上面可以看到,使用Action和Setter都可以指定一个简单的行为,Setter可以设置成根据一个值设定其View的具体行为。
6.可选的Bind操作:
默认情况下,@Bind和监听绑定某个具体的View是必需的。如果目标视图不能找到一个异常将被抛出。
为了抑制这种行为,创造一个可选的绑定,可以给属性或方法添加注释@Nullable。
注意:任何命名@Nullable注解可以用于此目的。并且鼓励使用@Nullable注解从Android的“支持批注”库,以解决在bind和具体View绑定时,当View无法找到而抛出异常的问题。具体请参阅Android的工具项目。
@Nullable @Bind(R.id.might_not_be_there) TextView mightNotBeThere; @Nullable @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() { // TODO ... }
7.多个方法监听:
方法注解,其相应的监听器具有多个回调可用于结合它们中的任何一个。每个注释具有其结合到一个缺省的回调。使用指定回调参数备用。
@OnItemSelected(R.id.list_view) void onItemSelected(int position) { // TODO ... } @OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED) void onNothingSelected() { // TODO ... }
8. 此外,它还包括简化了根据某个加载出来的视图去获取View。它使用泛型推断返回类型,并自动进行转换。
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);
很容易,直接使用ButterKnife的静态方法findById就可以轻松实现了。
享受其中的强大和有趣吧。
本文翻译自:http://jakewharton.github.io/butterknife/,个人翻译程度有限,还请小伙伴们多多支持!
相关文章推荐
- 【优才原创】Android的拖放机制
- Android事件分发 ——Activity篇
- android中Camera setDisplayOrientation使用
- 完全掌握Android Data Binding
- android apk反编译方法
- android:快速开发插件推荐
- Android Studio NDK开发入门
- Android 图片三级缓存之内存缓存(告别软引用(SoftRefrerence)和弱引用(WeakReference))
- Android实战技巧:深入解析AsyncTask
- 不走弯路之Android开发高薪就业指导
- Android 动态添加Fragment
- Android Activity转场动画
- Android图片压缩(质量压缩和尺寸压缩)
- android AIDL学习记录
- 如何在Ubuntu 12.04上安装Android静态分析工具包:Androguard
- 【转】三十三、Android给ListView设置分割线Divider样式
- android studio初窥门径
- Android手机 Fildder真机抓包
- Android 中Cursor学习笔记
- Android XML使用汇总