为了账号安全,请及时绑定邮箱和手机立即绑定

上下文在 Fragment .onStart() 方法中不可用

上下文在 Fragment .onStart() 方法中不可用

BIG阳 2021-12-10 16:30:31
我在 Fragment 中使用 MPAndroidCharts,它允许我生成我想要显示的必要表格。MPAndroidCharts 库的一部分需要以下内容来初始化图表,我的 Fragment.onStart()方法中有此代码:barColors.add(ContextCompat.getColor(getActivity().getApplicationContext(),R.color.bar_one));barColors.add(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.bar_two));barColors.add(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.bar_three));barColors.add(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.bar_four));barColors.add(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.bar_five));每隔一段时间我都会收到以下错误,我不确定为什么,每次打开托管 Fragment 的 Activity 时不会发生这种情况,但偶尔会发生。我相信 Fragment 的上下文尚未激活,但我无法确认:java.lang.NullPointerException:尝试在 com.troychuinard.livevotingudacity.Fragment.PollFragment.updatePollResultAnswersDynamically(PollFragment.java:355) 的空对象引用上调用虚拟方法“android.content.Context android.content.ContextWrapper.getApplicationContext()” ) 在 com.troychuinard.livevotingudacity.Fragment.PollFragment.access$1300(PollFragment.java:63) 在 com.troychuinard.livevotingudacity.Fragment.PollFragment$3.onDataChange(PollFragment.java:304) 在 com.database.fire. obfuscated.zzap.zza(com.google.firebase:firebase-database@@16.0.2:75) 在 com.google.firebase.database.obfuscated.zzca.zza(com.google.firebase:firebase-database@@16.0 .2:63) 在 com.google.firebase.database.obfuscated.zzcd$1.run(com.google.firebase:firebase-database@@16.0.2:55) 在 android.os.Handler.handleCallback(Handler.java :751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java。 lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) )
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

您应该将所有基于上下文的初始化移动到onAttach(Context context)方法。片段必须附加到上下文才能使用getActivity()方法。否则该方法将返回 null。


查看完整回答
反对 回复 2021-12-10
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您正在处理两个互不了解的不同组件生命周期:

  1. 您的片段生命周期并不总是具有附加的上下文(活动)

  2. 您的 Firebase ValueEventListener 的生命周期与从您的数据库读取数据相关联。

事物的编写方式,您的片段和 ValueEventListener 都不知道对方的生命周期。

您可以通过以下几种方式解决此问题:

在 onStop 中删除您的 ValueEventListener

由于 onStart 发生在 onAttach 之后,而 onStop 发生在 onDetach 之前,因此您可以删除 onStop 中的 ValueEventListener。这样,您的侦听器注册将是对称的。当然,当您的片段与上下文分离时,您会错过 DataSnapshots。如果没问题,这可能会正常工作。

将应用程序上下文传递给 Fragment 构造函数

另一种方法是让您的 Fragment 在它的构造函数中获取一个上下文并将其保存在成员变量中并引用它而不是调用getActivity().

注意:如果您确实在构造函数中传递了 Context,请确保从传入的 Context 中获取应用程序上下文并引用它以避免泄漏活动上下文。你可以通过调用来做到这一点context.getApplicationContext();


查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 287 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信