17

Мое приложение состоит из 4-х фрагментов в качестве вкладок, загружаемых внутри родительского фрагмента с использованием FragmentPagerAdapter.Попытка вызвать виртуальный метод 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' на ссылке нулевого объекта

Проблема заключается в том, когда я запустить приложение и нажать назад и повторно открыть приложение я получаю этот журнал ошибок:

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 !!!

ответ

30

После долгих исследований, похоже, это вопрос библиотека поддержки:

Activity with fragment and ViewPager crashesh on configuration change
Android Support Library issue 24.1.0

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

Attempt to invoke virtual method ‘android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()’ on a null object

Я переоцениваю метод finishUpdate моего FragmentPagerAdapter вот так и проблема решена на данный момент!

@Override 
public void finishUpdate(ViewGroup container) { 
    try{ 
     super.finishUpdate(container); 
    } catch (NullPointerException nullPointerException){ 
     System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate"); 
    } 
} 

любой ответ лучше? пожалуйста, дайте мне знать ...

+1

Я столкнулся с той же проблемой, я попытаюсь это исправить, пока официальное исправление не выпущен, –

+0

Рад, что он помогает :) –

+1

Работал для меня ... Спасибо. – Manoj

2

У меня была такая же проблема, и это было вызвано повторным использованием экземпляра ViewPager разными экземплярами фрагмента. Решение заключалось в том, чтобы обнулить адаптер в методе onDestroyView() фрагмента.

@Override public void onDestroyView() { 
    mViewPager.setAdapter(null); 
    super.onDestroyView(); 
} 

Проект демонстрации выпуска и решения can be found here.

3

У меня была та же проблема. В моем случае проблема заключалась в том, что я повторно использовал, не заметив адаптер с предыдущего открывшегося времени.

Я посмотрел в 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(); 
} 
2

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

@Override 
public void onStop() { 
    super.onDestroy(); //I was calling the wrong super 
} 
Смежные вопросы

 Смежные вопросы