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
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 ...
}
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();
}
});
}
@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