我正在使用Butterknife绑定我的一个片段中的单个视图。我在一个单独的片段中使用了Butterknife没有问题,但由于某种原因,在这个片段中绑定视图为null。我正在尝试添加一个子布局,我收到一个NPE,我无法弄清楚为什么。我在这个片段中的设置与我在其他片段中完全相同的设置相同。
这是片段的片段,包括Butterknife代码。
private View view;
@BindView(R.id.layoutHolder)
LinearLayout layoutHolder;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_log, container, false);
ButterKnife.setDebug(true);
ButterKnife.bind(this, view);
return view;
}
这是抛出NPE的方法。
private void addLayoutToHolder(LinearLayout layout) {
layoutHolder.addView(layout, 0);
}
这是错误:
java.lang.NullPointerException: Attempt to invoke virtual method
'void android.widget.LinearLayout.addView(android.view.View, int)'
on a null object reference
at com.omitted.LogFragment.addLayoutToHolder(LogFragment.java:101)
这是Butterknife.setdebug的输出,看起来很好。
Looking up view binder for com.omitted.LogFragment
HIT: Loaded view binder class.
Looking up view binder for com.omitted.CalculatorFragment
HIT: Loaded view binder class.
我还检查过确保layoutHolder确实为null,它确实是。但对于我的生活,我无法弄清楚为什么。
我可以在添加布局之前分配layoutHolder,它可以正常工作。
private void addLayoutToHolder(LinearLayout layout) {
layoutHolder = ButterKnife.findById(view, R.id.layoutHolder);
layoutHolder.addView(layout, 0);
}
所以它现在有效,但我不明白为什么在我的onCreateView中的地狱Butterknife.bind没有正确绑定视图。
我希望我能够很好地描述这个问题......
感谢您的任何见解。
答案 0 :(得分:2)
我遇到了同样的问题,我解决了将butterknife-compiler添加为apt的问题。 你可以在ButterKnife的readme
中看到它答案 1 :(得分:1)
确保您正在实现这种依赖关系
dependencies {
/* ... */
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
annotationProcessor行非常重要
答案 2 :(得分:0)
我的猜测是你在ButterKnife绑定发生之前调用addLayoutToHolder,这就是layoutHolder为空的原因。 您在生命周期的哪个阶段调用该方法?
答案 3 :(得分:0)
我发现在使用
启用gradle中的 jack编译器选项后...
jackOptions.enabled = true
...
某处butterknife无法找到视图绑定器,视图始终为空。