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

时间:2015-04-01 12:20:15

标签: android onclick optional butterknife

我有一项活动,在网络请求完成时会对视图进行通胀。 这个视图的一些小部件必须附加到一个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注释。

  

必填视图&infrance_bt1' ID为XXXXXXXX的方法' onClick'没找到。如果此视图是可选的,则添加' @ Optional'注释

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

谢谢

3 个答案:

答案 0 :(得分:41)

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

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

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

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

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

方法IllegalStateException会抛出null

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

答案 1 :(得分:28)

正确答案是使用@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 ...
}

答案 2 :(得分:2)

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

如果您包含Butulknife文档和@AutonomousApps所说的可空,那么即使您不是一直使用它们,也可以包含ids。

如果您不使用appcompact库,请记住包含注释支持库。请检查此链接Support Annotations