使用Butterknife注入一组视图

时间:2014-02-17 13:35:06

标签: android butterknife

目前我有这一系列观点:

ImageView activityImageViews[] = {
    (ImageView) rootView.findViewById(R.id.img_activity_1),
    (ImageView) rootView.findViewById(R.id.img_activity_2),
    (ImageView) rootView.findViewById(R.id.img_activity_3),
    (ImageView) rootView.findViewById(R.id.img_activity_4)
};

有没有办法可以使用Butterknife来注入所有这些观点?我需要将它们保存在一个数组中(或者以某种方式让我可以迭代它们)。

2 个答案:

答案 0 :(得分:46)

目前可以将多个视图作为数组注入。来自ButterKnife documentation(参见VIEW LISTS部分)

@InjectViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;

多次点击监听器也是如此:

@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();
  }
}

更新2017-09-19 : 由于Butterknife版本Version 7.0.0 (2015-06-27) @Bind已取代@InjectView@InjectViews。 但是,由于版本Version 8.0.0 (2016-04-25) @Bind分别用@BindView@BindViews替换为一个视图和多个视图。 所以现在正确的语法是:

@BindView(R.id.button1) Button button1;
@BindView(R.id.button2) Button button2;

@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;

答案 1 :(得分:2)

我认为添加到数组中的元素是动态的,否则您可以逐个在标题中声明它们,然后将它们添加到数组中:

// in the header:
@InjectView(R.id.imageview1) ImageView imageView1;
@InjectView(R.id.imageview2) ImageView imageView2;
@InjectView(R.id.imageview3) ImageView imageView3;

// inside your code:
ImageView activityImageViews[] = {
    imageView1, imageView2, imageView3
};

但是,如果元素是动态的(元素的数量/元素的ID等),你唯一能做的就是使用ButterKnife.findById来节省ImageView演员阵容 - 你可以不要通过注释注入它们,因为Butterknife不知道在编译时生成/注入什么(信息首先在运行时可用)。

ImageView activityImageViews[] = {
    ButterKnife.findById(view, R.id.img_activity_1),
    ButterKnife.findById(view, R.id.img_activity_2),
    ButterKnife.findById(view, R.id.img_activity_3),
    ButterKnife.findById(view, R.id.img_activity_4)
};