@OnClick array with optional ids (ButterKnife)
@OnClick array with optional ids (ButterKnife)
我有一个 activity 可以在 Web 请求完成时扩充视图。
这个视图的一些小部件必须附加到一个 onClick
方法,所以我有:
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
// ...
}
由于创建应用时R.id.inflated_bt1
和R.id.inflated_bt2
不存在,因此抛出异常建议设置@Optional
注释。
Required view 'inflated_bt1' with ID XXXXXXXX for method 'onClick' was not found. If this view is optional add '@Optional' annotation.
有没有办法用 @Optional
注释设置一些视图,并在视图膨胀时注入它们?或者,还有其他方法吗?
谢谢
只需在您的方法顶部添加 @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();
}
});
并且方法 findRequiredView
在视图为 null
时抛出 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
注释。 请参阅 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 ...
}
@Nullable
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
// ...
}
如果您像 Butterknife 文档和@AutonomousApps 所说的那样包含 nullable,那么即使您没有一直使用它们,您也可以尽可能多地包含 id。
如果您不使用 appcompact 库,请记住包含注释支持库。检查这个 link Support Annotations
我有一个 activity 可以在 Web 请求完成时扩充视图。
这个视图的一些小部件必须附加到一个 onClick
方法,所以我有:
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
// ...
}
由于创建应用时R.id.inflated_bt1
和R.id.inflated_bt2
不存在,因此抛出异常建议设置@Optional
注释。
Required view 'inflated_bt1' with ID XXXXXXXX for method 'onClick' was not found. If this view is optional add '@Optional' annotation.
有没有办法用 @Optional
注释设置一些视图,并在视图膨胀时注入它们?或者,还有其他方法吗?
谢谢
只需在您的方法顶部添加 @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();
}
});
并且方法 findRequiredView
在视图为 null
时抛出 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 home page。 @Nullable
注释。用法示例:
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 ...
}
@Nullable
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
// ...
}
如果您像 Butterknife 文档和@AutonomousApps 所说的那样包含 nullable,那么即使您没有一直使用它们,您也可以尽可能多地包含 id。
如果您不使用 appcompact 库,请记住包含注释支持库。检查这个 link Support Annotations