我的应用程序包含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)
...
父Fragment中的代码行是:
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
且ViewPage
和Adapter
都不为空!!
我必须提到我的所有Fragment
生命周期都在管理中并且在适配器内部发生了null问题!并且当我使用Activity
作为父级时,相同的适配器工作正常Fragment
!!!
答案 0 :(得分:34)
经过大量研究后,看起来它是一个支持库问题:
Activity with fragment and ViewPager crashesh on configuration change
Android Support Library issue 24.1.0
我也找到了这个答案,但在我的代码中添加一个标志看起来很不寻常:
我这样覆盖finishUpdate
的{{1}}方法,现在问题解决了!
FragmentPagerAdapter
任何更好的答案?请让我知道...
答案 1 :(得分:4)
我知道可能会迟到,但这是我直接看不到的愚蠢错误:
@Override
public void onStop() {
super.onDestroy(); //I was calling the wrong super
}
答案 2 :(得分:3)
我遇到了同样的问题,它是由片段的不同实例重用ViewPager
实例引起的。解决方案是在片段的onDestroyView()
方法中使适配器为空。
@Override public void onDestroyView() {
mViewPager.setAdapter(null);
super.onDestroyView();
}
项目演示问题和解决方案can be found here。
答案 3 :(得分: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();
}
答案 4 :(得分:1)
我的项目有同样的问题。但这是我的错。
为什么
在活动调用onDestroy()之后,我在回调中调用onBackPressed;
因为在调用onDestroy()之后,FragmentManager中的mHost实例被设置为null。
,当调用onBackPressed时,它将再次使用mHost实例。
答案 5 :(得分:0)
我使用错误的活动引用来获取
getSupportFragmentManager()
使用正确的活动为我修复了崩溃。
答案 6 :(得分:0)
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}
覆盖活动中的onBackPressed
。.
删除超级调用:super.onBackPressed
并结束通话。