18

目前我有这一系列的观点:

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 注入所有这些视图?我需要将它们保存在一个数组中(或者以某种方式让我可以迭代它们)。

4

2 回答 2

48

目前可以将多个视图作为数组注入。来自 ButterKnife文档(请参阅查看列表部分)

@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 版本7.0.0 (2015-06-27) @Bind替换@InjectView@InjectViews. 但是自从版本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;
于 2014-06-17T17:52:35.503 回答
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)
};
于 2014-02-17T13:51:08.537 回答