我有一项活动,在网络请求完成时会对视图进行通胀。
这个视图的一些小部件必须附加到一个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
注释。
必填视图&infrance_bt1' ID为XXXXXXXX的方法' onClick'没找到。如果此视图是可选的,则添加' @ Optional'注释
有没有办法用@Optional
注释设置一些视图,并在视图膨胀时注入它们?或者,还有另一种方法吗?
谢谢
答案 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