vic*_*alm 28 android onclick optional butterknife
我有一个活动,在Web请求完成时膨胀视图.这个视图的一些小部件必须附加到一个onClick方法,所以我有:
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
由于R.id.inflated_bt1和R.id.inflated_bt2创建应用程序时不存在,它抛出一个异常提示设置一个@Optional注解.
找不到方法'onClick'的ID为XXXXXXXX的必需视图'inflated_bt1'.如果此视图是可选的,请添加"@Optional"注释.
有没有办法用@Optional注释设置一些视图,并在视图膨胀时注入它们?或者,还有另一种方法吗?
谢谢
Kon*_*iak 42
只需@Optional在方法顶部添加注释,如下面的代码所示:
@Optional
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2})
public void onClick(View view) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
有一种情况,您没有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();
}
});
Run Code Online (Sandbox Code Playgroud)
并且该视图是findRequiredView抛出的方法.IllegalStateExceptionnull
但是当你使用额外的@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();
}
});
}
Run Code Online (Sandbox Code Playgroud)
Aut*_*pps 32
正确的答案是使用@Nullable注释.请参阅Butterknife主页.用法示例:
import android.support.annotation.Nullable;
@Nullable
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Run Code Online (Sandbox Code Playgroud)
编辑:
在我写这个答案并且它被接受后的那一年,Butterknife文档发生了变化,目前用于实现这一目标的首选方法是使用@Optional注释.由于这是公认的答案,因此我认为更新它以解决当前的做法很重要.例如:
import butterknife.Optional;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18334 次 |
| 最近记录: |