Попытка вызвать виртуальный метод "android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()" в ссылке на нулевой объект
Мое приложение состоит из 4 фрагментов в качестве вкладок, загружаемых внутри родительского фрагмента, используя FragmentPagerAdapter
.
Проблема в том, что когда я запускаю приложение и нажимаю обратно и снова открываю приложение, я получаю этот журнал ошибок:
FATAL EXCEPTION: main
java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference
at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:1949)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1965)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:513)
...
строка кода внутри родительского фрагмента:
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
и ViewPage
и Adapter
оба значения не равны нулю.
Я должен упомянуть, что весь мой жизненный цикл Fragment
управляется, и нулевая проблема происходит внутри адаптера!, и тот же адаптер работает нормально, когда я использую Activity
как родительский, а не Fragment
!!!
Ответы
Ответ 1
После много исследований, похоже, что это проблема с библиотекой поддержки:
Активность с фрагментом и ViewPager crashesh при конфигурации изменить
Версия библиотеки поддержки Android 24.1.0
Я также нашел этот ответ, но выглядит необычно, добавив флаг в мой код:
Попытка вызвать виртуальный метод 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler() для нулевого объекта
Я переопределяю метод finishUpdate
моего FragmentPagerAdapter
, как это, и проблема решена на данный момент!
@Override
public void finishUpdate(ViewGroup container) {
try{
super.finishUpdate(container);
} catch (NullPointerException nullPointerException){
System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate");
}
}
какой-нибудь лучший ответ? пожалуйста, дайте мне знать...
Ответ 2
У меня была такая же проблема. В моем случае проблема заключалась в том, что я повторно использовал, не заметив адаптер с предыдущего открытого времени.
Я заглянул в класс FragmentManager.java, который отправил исключение, и на той же самой строке, в которой происходит сбой, говорится:
"Должен быть вызван из основного потока хоста фрагмента"
мой код:
PagerAdapter adapter = MPageAdapter.getInstance(getSupportFragmentManager());
viewPager.setAdapter(adapter);
потому что я использовал свой PageAdapter в качестве моста для связи между фрагментами, я использовал одноэлементный шаблон. Это работало хорошо для меня, но как только я повторил эту структуру в другой деятельности, я получил то же исключение. И причина в том, что я забыл уничтожить синглтон моего адаптера в конце каждого использования.
@Override
protected void onDestroy() {
MPageAdapter.Destroy(); //I forgot this one, that makes singleton = null;
super.onDestroy();
}
Ответ 3
У меня была такая же проблема, и это было вызвано повторным использованием экземпляра ViewPager
разными экземплярами фрагмента. Решением было обнулить адаптер в onDestroyView()
методе фрагмента.
@Override public void onDestroyView() {
mViewPager.setAdapter(null);
super.onDestroyView();
}
Проект демонстрации проблемы и решения можно найти здесь.
Ответ 4
Я знаю, что может быть поздно, но здесь моя глупая ошибка, которую я сразу не видел:
@Override
public void onStop() {
super.onDestroy(); //I was calling the wrong super
}