@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
и ввести их при раздутии представления? Или, есть ли другой способ сделать это?
Спасибо
Ответы
Ответ 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. Проверьте эту ссылку Аннотации поддержки