Использование 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, чтобы ввести все эти взгляды? Мне нужно держать их в массиве (или таким образом, чтобы я мог перебирать их).

Ответ 1

В настоящее время возможно ввести несколько представлений в виде массива. Из документации 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;

Ответ 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 cast - вы не можете их вводить через аннотацию, потому что 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)
};