Попытка вызвать виртуальный метод " android.ОС.Обработчик андроид.поддержка.В4.приложение.FragmentHostCallback.getHandler () на null объект ссылка
мое приложение состоит из 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
жизненный цикл s управляется, и проблема null происходит внутри адаптер! и тот же адаптер работает нормально, когда я использую Activity
как родитель вместо Fragment
!!!
7 ответов
после долгих поисков, похоже, что это проблема библиотеки поддержки:
активность с фрагментом и ViewPager crashesh на конфигурации изменить
Android поддержка библиотеки вопрос 24.1.0
Я также нашел этот ответ, но он выглядит необычным, добавляя флаг в мой код:
заменить на finishUpdate
метод my FragmentPagerAdapter
как это и проблема решена на данный момент!
@Override
public void finishUpdate(ViewGroup container) {
try{
super.finishUpdate(container);
} catch (NullPointerException nullPointerException){
System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate");
}
}
лучше ответить? пожалуйста, дайте мне знать...
Я знаю, что может быть поздно, но вот моя глупая ошибка, которую я не сразу увидел:
@Override
public void onStop() {
super.onDestroy(); //I was calling the wrong super
}
у меня была такая же проблема, и это было вызвано повторным использованием ViewPager
экземпляр различными экземплярами фрагмента. Решение было нулевым адаптер в onDestroyView()
метод фрагмента.
@Override public void onDestroyView() {
mViewPager.setAdapter(null);
super.onDestroyView();
}
проект демонтажа проблемы и решения можно посмотреть здесь.
у меня была та же проблема. В моем случае проблема заключалась в том, что я повторно использовал, не заметив, что адаптер с предыдущего времени открыт.
Я заглянул в 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();
}
У меня такая же проблема на моем проекте. Но это моя вина.
почему
Я вызываю onBackPressed в обратном вызове после того, как activity вызвала onDestroy ();
потому что экземпляр mHost в FragmentManager имеет значение null после вызова onDestroy ().
и при вызове onBackPressed он снова будет использовать экземпляр mHost.
Я использовал неправильную ссылку активности для извлечения
getSupportFragmentManager ()
использование правильной активности исправило сбой для меня.
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}
переопределить onBackPressed
в активности..
удалить супер вызов:super.onBackPressed
и вызовите finish.