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

Moh*_*ini 20 android nullpointerexception android-fragments fragmentpageradapter android-support-library

我的应用程序由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)
    ...
Run Code Online (Sandbox Code Playgroud)

父片段内的代码行是:

viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
Run Code Online (Sandbox Code Playgroud)

ViewPageAdapter两个不为空!

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

Moh*_*ini 36

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

带有片段和ViewPager的活动在配置更改时崩溃了
Android支持库问题24.1.0

我也找到了这个答案,但在我的代码中添加一个标志看起来很不寻常:

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

我覆盖了finishUpdateFragmentPagerAdapter这样的方法,现在问题解决了!

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

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

  • 它发生在我身上,但我无法重现它。你如何重现它? (2认同)

Liu*_*Tom 12

我的项目也有同样的问题。但这是我的错。

为什么

在活动调用 onDestroy() 后,我在回调中调用 onBackPressed;

因为在调用 onDestroy() 之后 FragmentManager 中的 mHost 实例设置为 null。

当调用 onBackPressed 时,它将再次使用 mHost 实例。


var*_*990 6

@Override
public void onBackPressed() {
//     super.onBackPressed();
       finish();
}  
Run Code Online (Sandbox Code Playgroud)

覆盖onBackPressedin 活动..
删除超级调用:super.onBackPressed
并调用完成。