Android FragmentManager BackStackRecord.run бросает NullPointerException

Иногда я получаю следующее исключение при работе с fragmentами:

FATAL EXCEPTION: main java.lang.NullPointerException at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:591) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 

Исключение возникает, когда run() BackStackRecord вызывается через execPendingTransactions() , когда он пытается удалить fragment из менеджера.

 case OP_REMOVE: { Fragment f = op.fragment; f.mNextAnim = op.exitAnim; <---- mManager.removeFragment(f, mTransition, mTransitionStyle); } break; 

Я не могу понять, что именно вызывает это? Я думаю, что это связано с тем, что fragmentы не очищаются сразу после удаления fragmentов.

Отвечая на мой вопрос:

Это исключение (в конце концов) вызывается при вызове FragmentTransaction.remove(null); и FragmentTransaction.commit();

EDIT: А также, например, Twice Circled и shinyuX указывают в комментарии; при вызове методов show(null) или add(null) , attach(null) и detach(null) и, вероятно, также hide(null)

После вызова commit() транзакция будет помещена в очередь в FragmentManager. В результате, когда операция обрабатывается после того, как вы явно вызываете FragmentManager.executePendingTransactions() , или когда stream очереди FragmentManager вызывает это, он выдает NullPointerException .

В моем случае я поддерживал состояния fragmentов в глобальном объекте. Там я проверил, показывал ли fragment или нет, а затем удалял видимые fragmentы. Но поскольку я начал новую FragmentActivity, эти состояния по-прежнему были установлены в true, пока они не были видны. Так что это ошибка дизайна.

Помимо исправления ошибки проектирования, решение было простым: проверьте, вернул ли FragmentManager.findFragmentByTag() null перед удалением fragmentа.

Одна из причин, почему это происходит, вызывает

 getSupportFragmentManager().beginTransaction().remove(fragment) 

а fragment равен нулю

Я не использую тег для создания fragmentов (они работают как контейнеры TabBar).

Таким образом, он работает при изменении вкладки, но если я нажму кнопку «Назад», я получаю ту же ошибку.

В методе onDestroyView я нашел экземпляр fragmentа с FragmentManager # findFragmentById, однако FragmentManager # findFragmentByTag возвращает null, обязательно.

 class MyFragment extends ListFragment { @Override public void onDestroyView() { super.onDestroyView(); if (this.mapFragment != null && getFragmentManager().findFragmentById( this.mapFragment.getId()) != null) { getFragmentManager().beginTransaction().remove(this.mapFragment) .commit(); this.mapFragment = null; } } } 
  • Design lib - CoordinatorLayout / CollapsingToolbarLayout с GridView / listView
  • Каков самый простой способ обратного преобразования ArrayList?
  • Могу ли я последовательно переключать асинхронную задачу (начиная с одной после завершения предыдущей асинтезы)
  • Существует ли java-эквивалент функции eval python?
  • Как включить Spongy Castle JAR в Android?
  • Завершить все предыдущие действия
  • Преобразование строки в целое число на Android
  • Android получает значение от выбранного радиообмена
  • Как записать файлы на внешнее общедоступное хранилище на Android, чтобы они были видны из Windows?
  • onInterceptTouchEvent получает только ACTION_DOWN
  • ksoap2 org.xmlpull.v1.xmlpullparserexception Ожидаемая ошибка start_tag
  • Interesting Posts

    Сохранение объекта поверх клавиатуры в случае старта FirstResponder или resignFirstResponder?

    Лучшая практика управления репутацией Голанга

    прослушиватель событий события на стилизованных значках и ярлыках карты

    Стоит ли использовать кабельный модем DOCSIS 3 для премиального кабельного интернет-сервиса?

    Аккумуляторы Prolog. Действительно ли это «другая» концепция?

    Разрешения: папка с информацией об объеме системы, Windows 7

    Gnuplot: как загрузить и отобразить одно числовое значение из файла данных

    C # Сортировка коллекции, которая позволяет дублировать ключи

    Отладка против выпуска в CMAKE

    XML Parser для C

    Как установить свойства ViewBag для всех представлений без использования базового classа для controllerов?

    Что делает знак вопроса и точечный оператор?. означает в C # 6.0?

    swift: как получить indexpath.row при нажатии кнопки в ячейке?

    android.os.NetworkOnMainThreadException с android 4.2

    Проект Android не может ссылаться на другой проект в eclipse

    Давайте будем гением компьютера.