OncreateView中的java意外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();
...
}
这在我的模拟器和测试设备上运行良好。但当我查看play store崩溃报告时,我看到一些用户在activeConversation.getId()
中出现空指针异常
这个问题的原因是什么?我该如何解决
# 1 楼答案
应该始终使用片段参数将数据传递给片段
下面是你的应用程序崩溃的情况。用户使用您的片段启动活动。通过参数将数据传递给片段。实例已正确创建。现在用户转到其他应用程序,你的应用程序转到后台。在某个时刻,如果用户不再使用它,Android系统将终止该活动,但它将记住用户停止的位置,以便在用户返回后重新创建状态。在这个场景中,它知道要创建哪个活动和哪个片段。在本例中,它将使用默认构造函数创建片段。由于默认构造函数没有填充静态
activeConversation
,应用程序在onCreateView
中崩溃相反,在
newInstance
中,将此信息放入参数包中,然后在onCreateView
中使用它。更多信息请点击这里:https://developer.android.com/reference/android/app/Fragment#setArguments(android.os.Bundle)片段的参数在片段重新创建期间保持不变