android编程虚方法,尝试在空对象引用上调用虚方法’android.os.Handler android.support.v4.app.FragmentHostCallback.getHandle...

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

并致电完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值