Отладка нулевого указателя

краткое изложение того, что я пытаюсь сделать.

Использование общих настроек, чтобы при просмотре видео рядом с ним появлялась зеленая галочка, означающая, что оно завершено. В настоящее время возникает ошибка нулевого указателя.

В основном есть две страницы - главная страница и страница видео. Когда пользователь попадает на главную страницу, оператор if должен проверить общие настройки, чтобы узнать, посещали ли они уже страницу с видео. Если они есть, он должен отображать завершенныйTick imageView.

См. код и контекст ниже.

ФРАГМЕНТ КОДА ГЛАВНОЙ СТРАНИЦЫ:

 /**
 * Shared preferences variable which is used to store the userId which is captured at the login screen.
 */
private SharedPreferences loginPref, activityPref;   
private ImageView completedTick;
private Boolean activityCompleted;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    loginPref = getContext().getSharedPreferences("loginPref", Context.MODE_PRIVATE);
    activityPref = getContext().getSharedPreferences("activityPref", Context.MODE_PRIVATE);
    activityCompleted = activityPref.getBoolean("activityCompleted", true);

    View view = inflater.inflate(R.layout.fragment_activities, container, false);

    initialiseRecyclerView(view);
    retrieveActivities();

    if (activityCompleted == false || activityCompleted == null ) {
        completedTick.setVisibility(view.INVISIBLE);
    }else{
        completedTick.setVisibility(View.VISIBLE);
    }

    return view;

}

@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

}

/**
 * Method which is used to initialise the recycler view
 *
 * @param view
 */
private void initialiseRecyclerView(View view) {
    mRecyclerView = view.findViewById(R.id.recyclerViewActivities);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    EmptyAdapter emptyAdapter = new EmptyAdapter();
    mRecyclerView.setAdapter(emptyAdapter);
    completedTick = view.findViewById(R.id.completedTick);
}

ФРАГМЕНТ КОДА СТРАНИЦЫ ВИДЕО:

private SharedPreferences activityPref;
private Boolean activityCompleted;


@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.youtube_layout);

    Log.d(TAG, "onCreateView: Starting");
    activityPref = getSharedPreferences("activityPref", MODE_PRIVATE);
    activityCompleted = activityPref.getBoolean("activityCompleted", true);

        getExtrasMethod();
        initialiseViews();
        setTextInViews();
        checkCompleteD();


 private void checkCompleteD() {

    if (activityCompleted) {
        SharedPreferences.Editor editor = activityPref.edit();
        activityCompleted = false;
        editor.putBoolean("activityCompleted", activityCompleted);
        editor.apply();

    }
}

Ошибка:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setVisibility(int)' on a null object reference
        at com.example.fit.ActivitiesFragment.onCreateView(ActivitiesFragment.java:78)

ОБНОВИТЬ:

Внесены предложенные изменения

@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    loginPref = getContext().getSharedPreferences("loginPref", Context.MODE_PRIVATE);
    activityPref = getContext().getSharedPreferences("activityPref", Context.MODE_PRIVATE);
    activityCompleted = activityPref.getBoolean("activityCompleted", true);

    completedTick = view.findViewById(R.id.completedTickImage);
    initialiseRecyclerView(view);
    retrieveActivities();

    if (activityCompleted == false || activityCompleted == null) {
        completedTick.setVisibility(View.INVISIBLE);
    } else {
        completedTick.setVisibility(View.VISIBLE);
    }
}

java.lang.NullPointerException: попытка вызвать виртуальный метод «void android.widget.ImageView.setVisibility (int)» для нулевой ссылки на объект в com.example.feelingfit.ActivitiesFragment.onViewCreated(ActivitiesFragment.java:85)

Что это за строка: completeTick.setVisibility(View.INVISIBLE);

view.findViewById(R.id.completedTick) возвращается null. Выясните, почему.
Stephen C 30.05.2019 11:03

Попробуйте объявить findViewById в onCreateView и скажите мне, получаете ли вы нуль или нет.

Abedin.Zhuniqi 30.05.2019 11:05

Он по-прежнему нулевой, обновил вопрос, чтобы показать обновления, которые я внес в код.

androidnewbie 30.05.2019 11:39
0
3
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Прежде всего, ваш completedTick равен нулю. Попробуйте поместить completedTick = view.findViewById(R.id.completedTick); в свой OnViewCreatedнад этот код:

if (activityCompleted == false || activityCompleted == null ) {
        completedTick.setVisibility(View.INVISIBLE);
    }else{
        completedTick.setVisibility(View.VISIBLE);
    }

А также замените view.INVISIBLE на View.INVISIBLE

Редактировать + Дополнительная информация:

Если вы снова увидите NullPointerException, обратитесь к эта ссылка.

Редактировать 2: Перепишите свой код внутри метода onViewCreated следующим образом:

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    return inflater.inflate(R.layout.fragment_activities, container, false);

}

@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
 loginPref = getContext().getSharedPreferences("loginPref", Context.MODE_PRIVATE);
        activityPref = getContext().getSharedPreferences("activityPref", Context.MODE_PRIVATE);
        activityCompleted = activityPref.getBoolean("activityCompleted", true);

        initialiseRecyclerView(view);
        retrieveActivities();

        if (activityCompleted == false || activityCompleted == null ) {
            completedTick.setVisibility(View.INVISIBLE);
        }else{
            completedTick.setVisibility(View.VISIBLE);
        }
}

Редактировать номер 3: Поскольку он снова дает сбой при том же варианте использования, я предполагаю, что ваш R.id.completedTickImage - это нет внутри вашего fragment_activities

Я думаю, что это сработает, потому что его декларации должны быть хорошими. Кстати brravo shqipe mvjen mire qe ka njerz qe punojn ne kete drejtim.

Abedin.Zhuniqi 30.05.2019 11:12

это моя страсть :)

coroutineDispatcher 30.05.2019 11:12

Я сделал именно то, что вы предложили, но теперь он дает нулевой указатель в этой строке: if (activityCompleted == false || activityCompleted == null ) {

androidnewbie 30.05.2019 11:17

хорошо, я обновлю свой ответ сейчас

coroutineDispatcher 30.05.2019 11:18

Скопировал и вставил это, все еще нулевой указатель ...... Я буду кричать :'(

androidnewbie 30.05.2019 11:51

@androidnewbie, пожалуйста, проверьте мое редактирование номер 3

coroutineDispatcher 30.05.2019 11:59

Вы правы... это recyclerView, поэтому фрагмент_активности просто содержит recyclerview, содержимое внутри представления находится в другом файле макета... Что мне делать?

androidnewbie 30.05.2019 12:03

Просто передайте свой код ImageView внутри фрагмента, который на самом деле его содержит.

coroutineDispatcher 30.05.2019 12:05

Этот фрагмент удерживает его, но это recyclerview, поэтому есть адаптер, адаптер содержит представление для каждого recycler viewholder.

androidnewbie 30.05.2019 12:10

Если этот ImageView находится внутри Recyclerview, вы должны добавить эту логику внутри класса ViewHolder в вашем адаптере.

coroutineDispatcher 30.05.2019 12:11

Спасибо Starvro, с вашей помощью мне удалось заставить его работать. Очень признателен.

androidnewbie 30.05.2019 14:16

Пожалуйста. Удачи в мире разработки

coroutineDispatcher 30.05.2019 14:52

Выполните операцию CompleteTick.setVisibility внутри onActivityCreated() метода, а также замените view.INVISIBLE на View.INVISIBLE

Другие вопросы по теме