您的位置:首页 > 移动开发 > Android开发

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/,个人翻译程度有限,还请小伙伴们多多支持!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: