在片段中使用Butterknife时,绑定视图为null

时间:2016-07-26 04:02:06

标签: android android-fragments nullpointerexception android-linearlayout butterknife

我正在使用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没有正确绑定视图。

我希望我能够很好地描述这个问题......

感谢您的任何见解。

4 个答案:

答案 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无法找到视图绑定器,视图始终为空。