【问题标题】:@OnClick array with optional ids (ButterKnife)带有可选 id 的 @OnClick 数组 (ButterKnife)
【发布时间】:2015-04-01 12:20:14
【问题描述】:

我有一个活动,当网络请求完成时会膨胀视图。 这个视图的一些小部件必须附加到一个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注解。

未找到方法“onClick”所需的 ID 为 XXXXXXXX 的视图“inflated_bt1”。如果此视图是可选的,请添加“@Optional”注释。

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

谢谢

【问题讨论】:

    标签: android onclick optional butterknife


    【解决方案1】:

    只需在方法顶部添加@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();
        }
      });
    

    当视图为null 时,方法findRequiredView 抛出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();
          }
        });
    }
    

    【讨论】:

    • 如何使用 ButterKnife.Finder? JavaDoc 显示“请勿使用”消息,我无法创建它:“无法从最终类 butterknife.ButterKnife.Finder 继承”
    • 为什么要使用这样的类?
    【解决方案2】:

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

    【讨论】:

    • 根据ButterKnife github页面,add a @Nullable annotation to fields or the @Optional annotation to methodsjakewharton.github.io/butterknife
    • @TheoKanning 您是否认真地否决了我的回答?文档发生了变化。当我一年多前回答这个问题时,没有Optional。如果答案需要更新,请更新!
    【解决方案3】:
    @Nullable
    @OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
    public void onClick(View view) {
        // ...
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      相关资源
      最近更新 更多