这可能听起来像个愚蠢的问题,但是在onCreate中收到的getArguments Bundle和Bundle有什么区别?
答案 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()
设置的参数即使在销毁后也会保留。
答案 2 :(得分:2)
onCreate中收到的Bundle包含重新创建活动时最近提供的数据,getArguments Bundle返回作为参数提供的bundle。
答案 3 :(得分:1)
无法再次设置用于片段创建和设置的参数包。 onCreate / onCreateView / onActivityCreated / onViewStateRestored中的包是savedInstanceState。您可以通过onSaveInstanceState
覆盖使用此持久保存值。片段创建后,savedInstanceState包通常为null,因此您可能希望使用getArguments。
关于getArguments的另一件事,你不必坚持这些值。它们将由fragment code为您重新创建。如果您尝试在已经拥有它们的片段上设置参数,您将遇到IllegalStateException