краткое изложение того, что я пытаюсь сделать.
Использование общих настроек, чтобы при просмотре видео рядом с ним появлялась зеленая галочка, означающая, что оно завершено. В настоящее время возникает ошибка нулевого указателя.
В основном есть две страницы - главная страница и страница видео. Когда пользователь попадает на главную страницу, оператор 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);
Попробуйте объявить findViewById
в onCreateView
и скажите мне, получаете ли вы нуль или нет.
Он по-прежнему нулевой, обновил вопрос, чтобы показать обновления, которые я внес в код.
Прежде всего, ваш 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.
это моя страсть :)
Я сделал именно то, что вы предложили, но теперь он дает нулевой указатель в этой строке: if (activityCompleted == false || activityCompleted == null ) {
хорошо, я обновлю свой ответ сейчас
Скопировал и вставил это, все еще нулевой указатель ...... Я буду кричать :'(
@androidnewbie, пожалуйста, проверьте мое редактирование номер 3
Вы правы... это recyclerView, поэтому фрагмент_активности просто содержит recyclerview, содержимое внутри представления находится в другом файле макета... Что мне делать?
Просто передайте свой код ImageView
внутри фрагмента, который на самом деле его содержит.
Этот фрагмент удерживает его, но это recyclerview, поэтому есть адаптер, адаптер содержит представление для каждого recycler viewholder.
Если этот ImageView находится внутри Recyclerview
, вы должны добавить эту логику внутри класса ViewHolder
в вашем адаптере.
Спасибо Starvro, с вашей помощью мне удалось заставить его работать. Очень признателен.
Пожалуйста. Удачи в мире разработки
Выполните операцию CompleteTick.setVisibility
внутри onActivityCreated()
метода, а также замените view.INVISIBLE
на View.INVISIBLE
view.findViewById(R.id.completedTick)
возвращаетсяnull
. Выясните, почему.