Подтвердить что ты не робот

@OnClick массив с дополнительными идентификаторами (ButterKnife)

У меня есть активность, которая раздувает представление при завершении веб-запроса. Некоторые из виджетов этого представления должны быть привязаны к одному методу onClick, поэтому у меня есть:

@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
    // ...
}

Поскольку R.id.inflated_bt1 и R.id.inflated_bt2 не существуют, когда приложение создано, оно генерирует исключение, предлагающее установить аннотацию @Optional.

Требуемый вид 'inflated_bt1' с идентификатором XXXXXXXX для метода 'onClick' не найден. Если это представление необязательно, добавьте аннотацию @Optional.

Есть ли способ установить некоторые из представлений с аннотацией @Optional и ввести их при раздутии представления? Или, есть ли другой способ сделать это?

Спасибо

4b9b3361

Ответ 1

Правильный ответ - использовать аннотацию @Nullable. См. домашнюю страницу Butterknife. Пример использования:

import android.support.annotation.Nullable;

@Nullable
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
    // TODO ...
}

EDIT:

За год, с тех пор как я написал этот ответ, и он был принят, Документы Butterknife изменились, и в настоящее время предпочтительным методом для этого является использование аннотации @Optional. Поскольку это общепринятый ответ, я считаю важным обновить его, чтобы учесть текущую практику. Например:

import butterknife.Optional;

@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
    // TODO ...
}

Ответ 2

Просто добавьте аннотацию @Optional в верхней части вашего метода, как показано в приведенном ниже коде:

@Optional
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
    // ...
}

Существует случай, когда у вас нет R.id.inflated_bt1 в макете xml, который вы используете на своем Activity. Для случая, подобного этому, вы должны использовать аннотацию @Optional.

Когда вы используете только @OnClick аннотацию в YourClass$$ViewInjector, исходный код выглядит следующим образом:

view = finder.findRequiredView(source, 2131230789, "method 'onClick'");
view.setOnClickListener(
  new butterknife.internal.DebouncingOnClickListener() {
    @Override public void doClick(
      android.view.View p0
    ) {
      target.onClick();
    }
  });

а метод findRequiredView выбрасывает IllegalStateException, когда вид null.

Но когда вы используете дополнительно аннотацию @Optional, сгенерированный код выглядит ниже

view = finder.findOptionalView(source, 2131230789);
if (view != null) {
  view.setOnClickListener(
    new butterknife.internal.DebouncingOnClickListener() {
      @Override public void doClick(
        android.view.View p0
      ) {
        target.onClick();
      }
    });
}

Ответ 3

@Nullable
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
    // ...
}

Если вы включаете значение NULL, как указано в документах Butterknife, а также @AutonomousApps, то вы можете включать в себя как идентификаторы, даже если вы не используете их все время.

Не забудьте включить библиотеку поддержки аннотаций, если вы не используете библиотеку appcompact. Проверьте эту ссылку Аннотации поддержки