java - OncreateView 中出现意外的 NPE
问题描述
我正在将数据从活动发送到片段并使用以下代码启动片段:
if (conversation != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ConversationFragment conv = new ConversationFragment();
frgObj = ConversationFragment.newInstance(conversation);
fragmentTransaction.replace(R.id.container, frgObj, "ConversationFragment");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();
}
这是我的片段方法:
static Conversation activeConversation;
public static ConversationFragment newInstance(Conversation _activeConversation){
ConversationFragment fragment = new ConversationFragment();
activeConversation=_activeConversation;
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_conversation, container, false);
...
Long conversationId = activeConversation.getId();
...
}
这在我的模拟器和测试设备上运行良好。但是当我想播放商店崩溃报告时,我看到一些用户得到空指针异常activeConversation.getId()
什么可能导致此问题,我该如何解决?
解决方案
您应该始终使用片段参数将数据传递给片段。
这是您的应用程序崩溃的情况。用户使用您的片段开始活动。您通过参数将数据传递给片段。实例已正确创建。现在用户转到其他应用程序,您的应用程序转到后台。在某些时候,如果用户不再使用它,Android 系统会终止该活动,但它会记住用户离开的位置,以便在用户返回后重新创建状态。在这种情况下,它知道要创建哪个活动和哪个片段。在这种情况下,它将使用默认构造函数来创建片段。由于默认构造函数不会填充activeConversation
应用程序崩溃的静态onCreateView
。
相反,在您的 中newInstance
,将此信息放入参数包中,然后在您的onCreateView
. 更多信息在这里:https://developer.android.com/reference/android/app/Fragment#setArguments(android.os.Bundle)
片段的参数在片段重新创建期间被维护。
推荐阅读
- node.js - 如何在 AdonisJs 中使用 HasMany 关系
- sql-server - 如何在 SQL Server 中将 nvarchar 时间戳转换为 datetime2?
- spring-boot - Keycloak:通过用户名或用户ID获取访问令牌
- heroku - 为什么我的 Visual Studio 代码中的某些文件看起来更暗?
- javascript - D3.js 树状图单元格相互重叠
- java - 如何在尝试运行配置时找出文件丢失的原因(在 Java 中设置参数)?
- excel - 用户窗体列表框更改不更新文本框可见性
- webhooks - Webhook 到帐户中的特定组织
- docker - 如何获取正在运行的容器的完整端口详细信息
- c# - 如何列出在 Visual Studio 中实现接口的所有外部类