2015-04-01 1 views
21

У меня есть активность, которая раздувает представление при завершении веб-запроса. Некоторые из виджетов этой точки зрения должны быть присоединены к одному onClick методы, поэтому у меня есть:@OnClick массив с дополнительными идентификаторами (ButterKnife)

@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' с ID XXXXXXXX для метода 'onClick' не найден. Если это представление необязательно, добавьте аннотацию @Optional.

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

Спасибо

ответ

18

Правильный ответ заключается в использовании @Nullable аннотацию. См. Butterknife home page. Пример использования:

import android.support.annotation.Nullable; 

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

EDIT:

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

import butterknife.Optional; 

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

Согласно странице gitub ButterKnife, добавьте @Nullable аннотацию к полям или @Optional аннотацию к методам. Http://jakewharton.github.io/butterknife/ – TheoKanning

+3

@ TheoKanning Вы серьезно отказались от моего ответа? Документы изменились. Не было «Факультативного», когда я ответил на это примерно год назад. Если ответ нуждается в обновлении, обновите его! – AutonomousApps

36

Просто добавьте @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(); 
     } 
    }); 
} 
+0

Как использовать ButterKnife.Finder? JavaDoc показывает сообщение «НЕ ИСПОЛЬЗУЙТЕ», и я не могу его создать: «не может наследовать от конечного класса butterknife.ButterKnife.Finder» –

+0

Почему вы хотите использовать класс? –

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

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

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

Смежные вопросы