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); } };
Anroid的一些属性也可以和apply方法一起使用。
ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
2.3 监听绑定使用ButterKnife可以自动将监听配置到方法上。如下:
@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!"); }
一次绑定可以处理多个事件:
@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(); } }
自定义Views可以不同指定ID来绑定到自己的监听器:
public class FancyButton extends Button { @OnClick public void onClick() { // TODO do something! } }
2.4 绑定重置Fragments和Activity有不同的生命周期。在fragment的onCreateView绑定了之后,要在onDestroyView中置为null。BufferKnife在你调用了bind之后返回给了你一个Unbinder实例。你需要做的事情就是在适当的生命周期内调用unbind方法。
public class FancyFragment extends Fragment { @BindView(R.id.button1) Button button1; @BindView(R.id.button2) Button button2; private Unbinder unbinder; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fancy_fragment, container, false); unbinder = ButterKnife.bind(this, view); // TODO Use fields... return view; } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } }
2.5 可选绑定默认情况下,@Bind和监听器绑定都是必需的。 如果找不到目标视图,将抛出异常。
要抑制此行为并创建可选绑定,请将@Nullable注释添加到字段或将@Optional注释添加到方法中。
注意:任何名为@Nullable的注释都可用于字段。 我们鼓励使用Android的“支持注释”库中的@Nullable注释。
@Nullable @BindView(R.id.might_not_be_there) TextView mightNotBeThere; @Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() { // TODO ... }
2.6 多方法监听器方法注释,其相应的侦听器具有多个回调,可以用于绑定到任何一个。 每个注释都有一个默认的回调,它绑定到。 使用回调参数指定备用。
@OnItemSelected(R.id.list_view) void onItemSelected(int position) { // TODO ... } @OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED) void onNothingSelected() { // TODO ... }
2.7 Bonus还包括findById方法,它简化了仍然必须在View,Activity或Dialog上查找视图的代码。 它使用泛型来推断返回类型并自动执行转换。