web-dev-qa-db-fra.com

Tableau @OnClick avec identifiants facultatifs (ButterKnife)

J'ai une activité qui gonfle une vue lorsqu'une demande Web est terminée. Certains widgets de cette vue doivent être attachés à une méthode onClick, j'ai donc:

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

Comme R.id.inflated_bt1 et R.id.inflated_bt2 n'existe pas lorsque l'application est créée, elle lève une exception suggérant de définir un @Optional annotation.

La vue requise "inflated_bt1" avec l'ID XXXXXXXX pour la méthode "onClick" est introuvable. Si cette vue est facultative, ajoutez une annotation '@Optional'.

Existe-t-il un moyen de définir certaines vues avec le @Optional annotation et les injecter lorsque la vue est gonflée? Ou existe-t-il une autre façon de procéder?

Je vous remercie

27
victor.alm

La bonne réponse consiste à utiliser le @Nullable annotation. Voir la page d'accueil de Butterknife . Exemple d'utilisation:

import Android.support.annotation.Nullable;

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

MODIFIER:

Dans l'année depuis que j'ai écrit cette réponse et qu'elle a été acceptée, les documents Butterknife ont changé, et la méthode actuellement préférée pour y parvenir est d'utiliser le @Optional annotation. Puisque c'est la réponse acceptée, je pense qu'il est important de la mettre à jour pour répondre à la pratique actuelle. Par exemple:

import butterknife.Optional;

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

Ajoutez simplement @Optional annotation en haut de votre méthode comme indiqué dans le code ci-dessous:

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

Il y a un cas où vous n'avez pas R.id.inflated_bt1 dans la mise en page xml que vous utilisez sur votre Activity. Dans ce cas, vous devez utiliser @Optional annotation.

Lorsque vous utilisez uniquement @OnClick annotation dans YourClass$$ViewInjector le code source ressemble à ci-dessous:

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

et la méthode findRequiredView lance IllegalStateException lorsque la vue est null.

Mais lorsque vous utilisez en plus @Optional annotation, le code généré ressemble à ci-dessous

view = Finder.findOptionalView(source, 2131230789);
if (view != null) {
  view.setOnClickListener(
    new butterknife.internal.DebouncingOnClickListener() {
      @Override public void doClick(
        Android.view.View p0
      ) {
        target.onClick();
      }
    });
}
42
Konrad Krakowiak
@Nullable
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
    // ...
}

Si vous incluez nullable comme indiqué par les documents Butterknife et aussi par @AutonomousApps, vous pouvez inclure autant que id comme id même si vous ne les utilisez pas tout le temps.

N'oubliez pas d'inclure la bibliothèque de prise en charge des annotations si vous n'utilisez pas la bibliothèque appcompact. Vérifiez ce lien Annotations d'assistance

2
Anand