我的应用程序包含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的生命周期都在管理中,并且在适配器内部发生了null问题!当我使用Activity作为父级而不是Fragment时,同样的适配器工作正常!
经过大量研究,看起来它是一个支持库问题:
片段和ViewPager的活动在配置更改时崩溃
Android支持库问题24.1.0
我也find了这个答案,但在我的代码中添加一个标志看起来很不寻常:
尝试在空对象上调用虚拟方法’android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()’
我像这样重写了FragmentPagerAdapter的finishUpdate方法,现在问题解决了!
@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()方法onDestroyView()适配器为空。
@Override public void onDestroyView() { mViewPager.setAdapter(null); super.onDestroyView(); }
项目演示问题和解决方案可以在这里find 。
我遇到过同样的问题。 在我的情况下,问题是我重新使用而没有注意到上次打开时的适配器。
我查看了发送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(); }
我使用错误的活动引用来获取
getSupportFragmentManager()
使用正确的活动为我修复了崩溃。
我的项目有同样的问题。 但这是我的错。
为什么
在活动调用onDestroy()之后,我在回调中调用onBackPressed;
因为在调用onDestroy()之后,FragmentManager中的mHost实例被设置为null。
当调用onBackPressed时,它将再次使用mHost实例。
@Override public void onBackPressed() { // super.onBackPressed(); finish(); }
覆盖活动中的onBackPressed ..
删除超级调用: super.onBackPressed
并致电完成。