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 .

Solutions Collecting From Web of "NullPointerException в FragmentManager"

Хорошо, ребята, немного ударившись головой о кирпичную стену, я обнаружил, что это напрямую связано с объявлением моего фрагмента 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() */ } 

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