Связанный вид имеет значение null при использовании 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 действительно равен нулю, и это так. Но убей меня, я не могу понять, почему.

Я могу назначить layoutHolder прямо перед тем, как добавить в него макет, и он отлично работает.

private void addLayoutToHolder(LinearLayout layout) {
    layoutHolder = ButterKnife.findById(view, R.id.layoutHolder); 
    layoutHolder.addView(layout, 0);
}

Так что пока это работает, но я не понимаю, почему, черт возьми, Butterknife.bind в моем onCreateView неправильно привязывает представление.

Надеюсь, я достаточно хорошо описал эту проблему...

Спасибо за любое понимание.


person William Smith    schedule 26.07.2016    source источник
comment
Прошло почти неделя. Никто понятия не имеет?   -  person William Smith    schedule 01.08.2016
comment
проблема решена?\   -  person piotrek1543    schedule 18.08.2016


Ответы (4)


У меня была та же проблема, и я решил ее, добавив компилятор Butterknife как apt. Вы можете увидеть это в readme ButterKnife.

person Gema Sanchez    schedule 19.08.2016

Убедитесь, что вы реализуете такую ​​​​зависимость

dependencies {
    /* ... */
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

Строка annotationProcessor очень важна

person Community    schedule 31.07.2018

Я предполагаю, что вы вызываете addLayoutToHolder до того, как произойдет привязка ButterKnife, поэтому layoutHolder имеет значение null. В какой момент жизненного цикла вы вызываете этот метод?

person talosdev    schedule 02.08.2016

Я обнаружил, что после включения параметров компилятора jack в градиенте с помощью

...
jackOptions.enabled = true
...

где-то масляному ножу не удается найти связующее представление, и представления всегда нулевые.

person Seraphim's    schedule 08.09.2016