带有可选ID的@OnClick数组(ButterKnife)

vic*_*alm 28 android onclick optional butterknife

我有一个活动,在Web请求完成时膨胀视图.这个视图的一些小部件必须附加到一个onClick方法,所以我有:

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

由于R.id.inflated_bt1R.id.inflated_bt2创建应用程序时不存在,它抛出一个异常提示设置一个@Optional注解.

找不到方法'onClick'的ID为XXXXXXXX的必需视图'inflated_bt1'.如果此视图是可选的,请添加"@Optional"注释.

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

谢谢

Kon*_*iak 42

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

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

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

@OnClickYourClass$$ViewInjector源代码中仅使用注释时如下所示:

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

并且该视图是findRequiredView抛出的方法.IllegalStateExceptionnull

但是当你使用额外的@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();
      }
    });
}
Run Code Online (Sandbox Code Playgroud)


Aut*_*pps 32

正确的答案是使用@Nullable注释.请参阅Butterknife主页.用法示例:

import android.support.annotation.Nullable;

@Nullable
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
    // TODO ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

import butterknife.Optional;

@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
    // TODO ...
}
Run Code Online (Sandbox Code Playgroud)

  • @TheoKanning您是否真的低估了我的答案?文档改变了.当我在一年前回答这个问题时,没有一个"可选".如果答案需要更新,请更新它! (6认同)