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

Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference

我的应用程序由 4 个片段组成,作为使用 FragmentPagerAdapter.

在 parent 片段中加载的选项卡

问题是当我 运行 应用程序并按返回键和 re-open 应用程序时,我收到此错误日志:

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

parent 片段中的代码行是:

viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);

ViewPageAdapter都不为空!!

我不得不提一下,我所有的 Fragment 生命周期都在管理中,适配器内部发生了 null 问题!当我使用 Activity 时,同一个适配器工作正常parent 而不是 Fragment!!!

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

Activity with fragment and ViewPager crashesh on configuration change
Android Support Library issue 24.1.0

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

我重写了 FragmentPagerAdapterfinishUpdate 方法,问题暂时解决了!

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

还有更好的答案吗?请让我知道...

我有同样的问题,这是由片段的不同实例重用 ViewPager 实例引起的。一个解决方案是在片段的 onDestroyView() 方法中使适配器无效。

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

演示问题和解决方案的项目 can be found here

我遇到了同样的问题。在我的例子中,问题是我在没有注意到上次打开的适配器的情况下重新使用。

我查看了发送异常的 FragmentManager.java class 并且在崩溃的同一行上说: "Must be called from main thread of fragment host"

我的代码是:

PagerAdapter adapter = MPageAdapter.getInstance(getSupportFragmentManager()); 
viewPager.setAdapter(adapter);

因为我使用 PageAdapter 作为片段之间通信的桥梁,所以我使用了单例模式。这对我来说效果很好,但是一旦我在另一个 activity 中重复这个结构,我得到了同样的异常。原因是我忘记在每次使用结束时销毁适配器 class 的单例。

@Override
protected void onDestroy() {
    MPageAdapter.Destroy();  //I forgot this one, that makes singleton = null;
    super.onDestroy();
}

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

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

我使用了错误的 activity 引用来获取

getSupportFragmentManager()

使用正确的 activity 解决了我的崩溃问题。

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

为什么

我在 activity 调用 onDestroy() 之后在回调中调用 onBackPressed;

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

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

@Override
public void onBackPressed() {
//     super.onBackPressed();
       finish();
}  

覆盖 activity 中的 onBackPressed..
删除超级调用:super.onBackPressed
并调用 finish。

我通过在 ActivityonBackPressed() 中添加 !isFinishing 来解决它。

override fun onBackPressed() {
        if (!isFinishing) {            
            super.onBackPressed()
            // your implementation specific code here..
        }
    }

我的问题是通过一些代码流,我的 DialogFragment 在调用 finish() 之后调用其父 ActivityonBackPressed() 导致了这次崩溃.

如果有人仍在寻找答案,希望对您有所帮助!

只需注释 super.onBackPressed() 方法并编写 finish() 代替

@Override
public void onBackPressed() {
//     super.onBackPressed();
       finish();
}  

在我的例子中,这有效!