Android - onCreate中收到的getArguments和Bundle有什么区别

时间:2014-11-08 19:01:22

标签: android

这可能听起来像个愚蠢的问题,但是在onCreate中收到的getArguments Bundle和Bundle有什么区别?

4 个答案:

答案 0 :(得分:29)

<强> TL; DR:

Fragment.getArguments()用于初始创建片段。

onCreate(Bundle)用于从先前的实例中检索Bundle。

详细信息:

我一直在网上搜索并询问经验丰富的Android开发人员,所以这里有一个不错的解释:

作为 onCreate 函数中的参数传递的Bundle用于是否存在Fragment的前一个实例,该实例在调用 onSaveInstanceState 函数时更新。 (您可以在此处的官方文档中了解更多相关信息:https://developer.android.com/training/basics/activity-lifecycle/recreating.html

然而, Fragment.getArguments()函数在最初创建片段时使用。您将第一次导航到Fragment,并且该Fragment的前一个实例将不存在。在这种情况下,您可以使用setArguments()&amp; amp;来设置Fragment中的局部变量。 getArguments()函数。 (更多相关内容:https://developer.android.com/reference/android/app/Fragment.html

<强>因此: 强大的代码可能如下所示:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                            Bundle savedInstanceState)
{
    super.onCreateView(inflater, container, savedInstanceState);

    mView = inflater.inflate(R.layout.fragment_name, container, false);
    mContext = getActivity();

    if(savedInstanceState != null){
        Log.d("yourapp", "A SavedInstanceState exists, using past values");
        mValue = savedInstanceState.getString("valueString");
    }else{
        Log.d("yourapp", "A SavedInstanceState doesn't exist");
        Bundle bundle = getArguments();
        mValue = bundle.getString("valueString");
    }
}

处理你的onCreate状态的两种情况。

希望这有帮助!

答案 1 :(得分:3)

我想添加 N15M0_jk&#39> 答案。 有时不需要保存片段状态(对于静态片段),并且只能使用getArguments()进行重新创建,因为使用setArguments()设置的参数即使在销毁后也会保留。

请参阅setArguments()

上的参考资料

答案 2 :(得分:2)

onCreate中收到的Bundle包含重新创建活动时最近提供的数据,getArguments Bundle返回作为参数提供的bundle。

答案 3 :(得分:1)

无法再次设置用于片段创建和设置的参数包。 onCreate / onCreateView / onActivityCreated / onViewStateRestored中的包是savedInstanceState。您可以通过onSaveInstanceState覆盖使用此持久保存值。片段创建后,savedInstanceState包通常为null,因此您可能希望使用getArguments。

关于getArguments的另一件事,你不必坚持这些值。它们将由fragment code为您重新创建。如果您尝试在已经拥有它们的片段上设置参数,您将遇到IllegalStateException