尝试调用虚方法' android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'在null对象引用上

时间:2017-01-14 13:49:59

标签: android android-fragments nullpointerexception android-support-library fragmentpageradapter

我的应用程序包含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);

ViewPageAdapter都不为空!!

我必须提到我的所有Fragment生命周期都在管理中并且在适配器内部发生了null问题!并且当我使用Activity作为父级时,相同的适配器工作正常Fragment !!!

7 个答案:

答案 0 :(得分:34)

经过大量研究后,看起来它是一个支持库问​​题:

  

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的{​​{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
并结束通话。