NullPointerException в FragmentManager

Я использую библиотеку совместимости Android и иногда получаю странное NullPointerException :

 java.lang.NullPointerException at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:960) at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:768) at android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.java:1104) at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:410) at android.support.v4.content.Loader.deliverResult(Loader.java:103) at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:81) at android.support.v4.content.CursorLoader.onStartLoading(CursorLoader.java:126) at android.support.v4.content.Loader.startLoading(Loader.java:197) at android.support.v4.app.LoaderManagerImpl$LoaderInfo.start(LoaderManager.java:262) at android.support.v4.app.LoaderManagerImpl.doStart(LoaderManager.java:710) at android.support.v4.app.Fragment.onStart(Fragment.java:981) at android.support.v4.app.Fragment.performStart(Fragment.java:1332) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906) at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1240) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:612) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139) at android.support.v4.view.ViewPager.populate(ViewPager.java:804) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:433) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:405) at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:386) ... 

Очевидно, что я делаю что-то неправильно, чтобы позволить FragmentManager попасть в такое состояние, где он может так разбиться, но я понятия не имею, что. Соответствующий код в FragmentManagerImpl не предлагает мне никаких подсказок. Я предполагаю, что mActivity как-то null в этом пункте кода? Но это кажется невозможным, поскольку активность уже находится на экране, и я не добавляю никаких фрагментов – просто переключаюсь между ними в ViewPager .

Хорошо, ребята, немного ударившись головой о кирпичную стену, я обнаружил, что это напрямую связано с объявлением моего фрагмента setRetainInstance(true) . После устранения проблемы проблемы исчезли. Это похоже на ошибку библиотеки совместимости …

Я подниму что-то под соответствующим проектом Google. Желаем удачи, если вы читаете это медленно, рыдая! Надеюсь, это позволит вам решить эту проблему.

Я получил эту ошибку несколько дней назад и был довольно запутан, но я понял, что это потому, что FragmentTransaction , похоже, не получил ожидающих транзакций, поэтому при вызове executePendingTransactions(); NPE очень понравился этот.
Я решил это, убедившись, что каждая транзакция фактически что-то изменила (т. Е. Добавить фрагмент 1 -> удалить фрагмент 1 -> commit / execute не будет работать).
Также убедитесь, что ни один из фрагментов в пейджере не стал null .

Я получал ту же ошибку, потому что я ссылался на экземпляр фрагмента в адаптере пейджера вида, а сам фрагмент.

Создание нового экземпляра фрагмента каждый раз, когда фрагмент был вызван, разрешает эту ошибку. Очевидно, что это правильное программирование, но на всякий случай некоторые другие нообы делают эту ошибку ….

 @Override public Fragment getItem(int position) { if(position == 0) return new Walkthrough_Fragment_1(); if(position == 1) return new Walkthrough_Fragment_4(); if(position == 2) return new Walkthrough_Fragment_2(); else{ return new Walkthrough_Fragment_3(); } } 

Эта ошибка возникает при использовании FragmentPagerAdapter внутри фрагмента, использующего setRetainInstance(true) .

Если вы хотите сохранить setRetainInstance(true) вы можете использовать ответ @Marc из этого вопроса :

 @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { //do nothing here! no call to super.restoreState(arg0, arg1); } 

В какой-то момент вы используете экземпляр класса FragmentManager, который не инициализирован. Найдите эту точку и правильно инициализируйте объект.

Я просто прочитал, что вы не можете выполнять определенные транзакции по фрагментам, которые были добавлены во время компиляции. Например, если ваш фрагмент был определен в XML, и вы пытаетесь его заменить, бум.

Я решил свою проблему, сделав свой FragmentManager статической глобальной переменной, а затем инициализировал его в методе onCreate . Я узнал, что использование getSupportFragmentManager () везде в вашем коде может привести к этому исключению, поскольку getSupportFragmentManager () может указывать на ваше прежнее значение диспетчера фрагментов и не может ссылаться на него.

Вот пример:

  public class yourClass{ private static FragmentManager myFragmentManagerSupport; ... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myFragmentManagerSupport = this.getSupportFragmentManager(); .... } /*Then reuse myFragmentManagerSupport everywhere you needed instead of * getSupportFragmentManager() */ } 

Надеюсь, это поможет.

Intereting Posts
Могу ли я использовать AccountManager Android для получения токена доступа OAuth для AppEngine? Использование JWplayer в Android для потокового воспроизведения видео в Phonegap Java.io.IOException: Ошибка установления связи SSL: отказ в библиотеке SSL, обычно ошибка протокола Получить путь MediaStore к определенной папке Медленный поиск данных с помощью android и parse.com Что следует использовать в Android при портировании кода на C ++, написанном с помощью libsndfile? Как получить общую длину видео в виде видео в android Android эмулятор версии 16.0 persistant / system / storage? Как ограничить пользователя отображать только изображения JPG из галереи? Почему мое приложение бросает «android.permission.REBOOT SecurityException»? Что делает transitive = true в Gradle именно так (wrt crashlytics)? Сообщение об ошибке эмулятора Android: «PANIC: Отсутствует программа для эмулятора эмулятора для« x86 »CPUS». Android не может считывать содержимое окна на нескольких устройствах с помощью службы доступности Приложение для Android – связь с расширением Chrome Как можно использовать ViewPropertyAnimator для установки Width на определенное значение