Вложенная группа просмотра является нулевой после привязки с помощью Butterknife

Вот мой файл fragment_photo_gallery.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<RelativeLayout
    android:id="@+id/disconnected_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="gone">

    <ImageView
        android:id="@+id/disconnected_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:src="@drawable/ic_offline" />

    <TextView
        android:id="@+id/disconnected_title_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/disconnected_image"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="8dp"
        android:fontFamily="sans-serif-medium"
        android:gravity="center"
        android:text="@string/disconnected_title_text"
        android:textAppearance="?android:textAppearanceMedium" />

    <TextView
        android:id="@+id/disconnected_subtitle_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/disconnected_title_text"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="8dp"
        android:fontFamily="sans-serif"
        android:gravity="center"
        android:paddingLeft="8dp"
        android:paddingRight="8dp"
        android:text="@string/disconnected_subtitle_text"
        android:textAppearance="?android:textAppearanceSmall"
        android:textColor="#A2AAB0" />

    <Button
        android:id="@+id/disconnected_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/disconnected_subtitle_text"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="8dp"
        android:text="@string/disconnected_button_text" />

</RelativeLayout>

</RelativeLayout>

Я связываю все вещи в классе, который расширяет фрагмент:

public class PhotoGalleryFragment extends Fragment {

    ....

    @BindView(R.id.disconnected_view)
    RelativeLayout disconnectedView;

    ....

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_photo_gallery, container, false);
        unbinder = ButterKnife.bind(this, v);
        return v;
    }

    @Override public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }

    ....
}

И получить NPE по этому методу:

private void showDisconnectedView() {
    disconnectedView.setVisibility(View.VISIBLE);
    progressBar.setVisibility(View.GONE);
}

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.RelativeLayout.setVisibility(int)' on a null object reference

Моя сборка сборки выглядит нормально, поэтому я не знаю, почему я получаю такую ​​​​ошибку

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

Парень, который столкнулся с похожей проблемой, решил ее, изменив annotationProcessor на apt, но в моем случае он просто никогда не будет синхронизироваться.


БЫСТРОЕ ОБНОВЛЕНИЕ

Проблема по-прежнему возникает, даже если я заменю @BindView(R.id.disconnected_view)RelativeLayout disconnectedView; на disconnectedView = v.findViewById(R.id.disconnected_view); в своем методе onCreateView. Так что это не должно быть ошибкой масленка.


person Maxim Ovchinnikov    schedule 03.05.2018    source источник
comment
где вы вызываете метод showDisconnectedView()   -  person AskNilesh    schedule 03.05.2018
comment
@NileshRathod В классе PhotoGalleryFragment.   -  person Maxim Ovchinnikov    schedule 03.05.2018
comment
Вы просто забыли return v; внутри onCreateView()   -  person AskNilesh    schedule 03.05.2018


Ответы (1)


Используйте Butterknife без unbinder. Вам нужно вернуть уже завышенное представление, а не создавать новое представление и раздувать его.

Также примените специальный код представления в методе onViewCreated().

public class PhotoGalleryFragment extends Fragment {

@BindView(R.id.disconnected_view)
RelativeLayout disconnectedView;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_photo_gallery, container, false);
    ButterKnife.bind(this, v);
    return v;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    disconnectedView.setVisibility(View.GONE);
}
person buzzingsilently    schedule 03.05.2018
comment
Масляный нож без развязывателя дал мне тот же результат. - person Maxim Ovchinnikov; 03.05.2018
comment
Да, кажется, что onCreate вызывался до onCreateView, и поэтому мое представление было нулевым в этот момент. - person Maxim Ovchinnikov; 03.05.2018
comment
извините, но я не могу. Голосование доступно только при наличии 15 и более баллов. Я поддержу ваш ответ, как только получу эти очки. - person Maxim Ovchinnikov; 03.05.2018
comment
Пожалуйста, проголосуйте за этот ответ, если он помог. Удачного кодирования! - person buzzingsilently; 21.05.2018