@OnClickarrays与可选的ID(黄油刀)

当networking请求完成时,我有一个活动可以扩大视图。 这个视图的一些小部件必须附加到一个onClick方法,所以我有:

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

由于创build应用程序时不存在R.id.inflated_bt1R.id.inflated_bt2 ,它会抛出一个exception,提示设置@Optional注释。

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

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

谢谢

Solutions Collecting From Web of "@OnClickarrays与可选的ID(黄油刀)"

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

 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 ... } 

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

当view为nullfindRequiredView方法抛出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 @OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2}) public void onClick(View view) { // ... } 

如果您包括Butterknife文档以及@AutonomousApps可以使用的空值,那么即使您没有一直使用它们,也可以包含可能的id。

如果不使用appcompact库,请记住包含注释支持库。 选中此链接支持注释