首页 > 解决方案 > 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()

什么可能导致此问题,我该如何解决?

标签: javaandroid

解决方案


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

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

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

片段的参数在片段重新创建期间被维护。


推荐阅读