尝试调用虚拟方法android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()对空对象引用

我的应用程序由4个片段组成,使用FragmentPagerAdapter在父Fragment中加载标签。

问题是当我运行应用程序,然后按回来并重新打开应用程序,我收到此错误日志:

 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); 

ViewPageAdapter都不是空!

我不得不提到,我所有的Fragment的生命周期都在被pipe理,并且在适配器内部发生了null问题,并且当我使用Activity作为父代而不是Fragment时,同一个Adapter正常工作!

Solutions Collecting From Web of "尝试调用虚拟方法android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()对空对象引用"

经过大量的研究,看起来这是一个支持库的问题:

活动与片段和ViewPager crasheshconfiguration更改
Android支持库问题24.1.0

我也find了这个答案,但它看起来不寻常的添加一个标志,我的代码:

尝试调用空对象上的虚拟方法“android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()”

我重写我的FragmentPagerAdapterfinishUpdate方法是这样的,现在问题解决了!

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

任何更好的答案? 请告诉我…

我遇到过同样的问题。 在我的情况下,问题是我重新使用,而没有注意到以前打开的适配器。

我看着发送exception的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(); } 

我有同样的问题,这是由片段的不同实例的ViewPager实例的重用造成的。 一个解决scheme是在片段的onDestroyView()方法中将适配器置空。

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

项目演示的问题和解决scheme可以在这里find 。

我知道可能会迟到,但这是我没有看到的愚蠢的错误:

 @Override public void onStop() { super.onDestroy(); //I was calling the wrong super }