Попытка вызвать виртуальный метод " 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

Я также нашел этот ответ, но он выглядит необычным, добавляя флаг в мой код:

попытка вызвать виртуальный метод " android.ОС.Обработчик андроид.поддержка.В4.приложение.FragmentHostCallback.getHandler () на null объект

заменить на 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.