2015-04-01 25 views
21

我有一个活动,当Web请求完成时膨胀视图。 一些该视图的部件必须被连接到一个onClick方法,所以我有:@OnClick阵列与可选ID(黄油刀)

@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注释设置一些视图,并在视图膨胀时注入它们?或者,还有其他方法可以做到吗?

谢谢

回答

18

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

根据ButterKnife github页面,“添加一个@Nullable注释到字段或@Optional注释到方法”http://jakewharton.github.io/butterknife/ – TheoKanning 2017-02-14 00:07:25

+3

@TheoKanning你认真地downvote我的答案?文档已更改。当我在一年前回答这个问题时,没有一个“可选”。如果答案需要更新,请更新它! – AutonomousApps 2017-02-14 02:05:11

36

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

我该如何使用ButterKnife.Finder? JavaDoc显示“不使用”消息,我无法创建它: “无法继承最终类butterknife.ButterKnife.Finder” – 2015-04-13 06:58:16

+0

为什么要使用这样的类? – 2015-04-29 10:49:27

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

如果由Butterknife文档并且还通过@AutonomousApps说,那么你就可以作为可作为IDS即使你不使用他们所有的时间包括包括空。

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