android - bindview - @OnClick array con ids opcionales(ButterKnife)
bind android (3)
La respuesta correcta es usar la anotación @Nullable
. Ver la página de inicio de Butterknife . Ejemplo de uso:
import android.support.annotation.Nullable;
@Nullable
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
EDITAR:
En el año transcurrido desde que escribí esta respuesta y fue aceptada, los documentos de Butterknife cambiaron, y el método preferido actual para lograr esto es usar la anotación @Optional
. Dado que esta es la respuesta aceptada, creo que es importante actualizarla para abordar la práctica actual. Por ejemplo:
import butterknife.Optional;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Tengo una actividad que infla una vista cuando finaliza una solicitud web. Algunos de los widgets de esta vista deben adjuntarse a un método onClick
, por lo que tengo:
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
// ...
}
Como R.id.inflated_bt1
y R.id.inflated_bt2
no existen cuando se crea la aplicación, lanza una excepción que sugiere establecer una anotación @Optional
.
No se encontró la vista requerida ''inflated_bt1'' con ID XXXXXXXX para el método ''onClick''. Si esta vista es opcional, agregue la anotación ''@Opcional''.
¿Hay alguna forma de configurar algunas de las vistas con la anotación @Optional
e inyectarlas cuando la vista está inflada? O bien, ¿hay otra manera de hacerlo?
Gracias
Simplemente agregue la anotación @Optional
en la parte superior de su método como se muestra en el siguiente código:
@Optional
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
// ...
}
Hay un caso en el que no tienes R.id.inflated_bt1
en el diseño xml que usas en tu Activity
. Para casos como este tienes que usar la anotación @Optional
.
Cuando usa solo la anotación @OnClick
en el código fuente de YourClass$$ViewInjector
, se ve a continuación:
view = finder.findRequiredView(source, 2131230789, "method ''onClick''");
view.setOnClickListener(
new butterknife.internal.DebouncingOnClickListener() {
@Override public void doClick(
android.view.View p0
) {
target.onClick();
}
});
y el método findRequiredView
lanza la IllegalStateException
cuando la vista es null
.
Pero cuando usa adicionalmente la anotación @Optional
, el código generado se ve a continuación
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 incluye nullable como dicen los documentos de Butterknife y también los de @AutonomousApps, puede incluirlos como ids aunque no los esté utilizando todo el tiempo.
Recuerde incluir la biblioteca de soporte de anotaciones si no está utilizando la biblioteca compacta de aplicaciones. Compruebe este enlace Anotaciones de apoyo