@OnClick array with optional ids (ButterKnife)

@OnClick array with optional ids (ButterKnife)

我有一个 activity 可以在 Web 请求完成时扩充视图。 这个视图的一些小部件必须附加到一个 onClick 方法,所以我有:

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

由于创建应用时R.id.inflated_bt1R.id.inflated_bt2不存在,因此抛出异常建议设置@Optional注释。

Required view 'inflated_bt1' with ID XXXXXXXX for method 'onClick' was not found. If this view is optional add '@Optional' annotation.

有没有办法用 @Optional 注释设置一些视图,并在视图膨胀时注入它们?或者,还有其他方法吗?

谢谢

只需在您的方法顶部添加 @Optional 注释,如下面的代码所示:

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

有一种情况,您在 Activity 上使用的布局 xml 中没有 R.id.inflated_bt1。对于这种情况,您必须使用 @Optional 注释。

当您在 YourClass$$ViewInjector 源代码中仅使用 @OnClick 注释时,如下所示:

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

并且方法 findRequiredView 在视图为 null 时抛出 IllegalStateException

但是当你额外使用 @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();
      }
    });
}

正确答案是使用 @Nullable 注释。 请参阅 Butterknife home page用法示例:

import android.support.annotation.Nullable;

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

编辑:

在我写下这个答案并被接受后的那一年,Butterknife 文档发生了变化,目前实现这一目标的首选方法是使用 @Optional注解。由于这是公认的答案,我觉得更新它以解决当前的做法很重要。例如:

import butterknife.Optional;

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

如果您像 Butterknife 文档和@AutonomousApps 所说的那样包含 nullable,那么即使您没有一直使用它们,您也可以尽可能多地包含 id。

如果您不使用 appcompact 库,请记住包含注释支持库。检查这个 link Support Annotations