有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    应该始终使用片段参数将数据传递给片段

    下面是你的应用程序崩溃的情况。用户使用您的片段启动活动。通过参数将数据传递给片段。实例已正确创建。现在用户转到其他应用程序,你的应用程序转到后台。在某个时刻,如果用户不再使用它,Android系统将终止该活动,但它将记住用户停止的位置,以便在用户返回后重新创建状态。在这个场景中,它知道要创建哪个活动和哪个片段。在本例中,它将使用默认构造函数创建片段。由于默认构造函数没有填充静态activeConversation,应用程序在onCreateView中崩溃

    相反,在newInstance中,将此信息放入参数包中,然后在onCreateView中使用它。更多信息请点击这里:https://developer.android.com/reference/android/app/Fragment#setArguments(android.os.Bundle)

    片段的参数在片段重新创建期间保持不变