Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果存在getArguments(),我们是否应该在片段中使用savedInstanceState?_Android_Android Fragments_Onsaveinstancestate - Fatal编程技术网

Android 如果存在getArguments(),我们是否应该在片段中使用savedInstanceState?

Android 如果存在getArguments(),我们是否应该在片段中使用savedInstanceState?,android,android-fragments,onsaveinstancestate,Android,Android Fragments,Onsaveinstancestate,在Android片段中,我们可以从savedInstanceState或getArguments()获取onCreate()中的初始数据。我经常检查它们的null,然后分配变量。例如,在科特林: val bundle = savedInstanceState ?: arguments bundle?.let { startDate = Date(it.getLong(ARG_START_DATE, 0)) endDate = Date(it.getLong(ARG_END_DAT

在Android片段中,我们可以从
savedInstanceState
getArguments()
获取
onCreate()中的初始数据。我经常检查它们的
null
,然后分配变量。例如,在科特林:

val bundle = savedInstanceState ?: arguments
bundle?.let {
    startDate = Date(it.getLong(ARG_START_DATE, 0))
    endDate = Date(it.getLong(ARG_END_DATE, startDate.time))
}
因此,首先我检查是否
savedInstanceState!=空
,如果是,将从那里获取数据。如果它是
null
,我将检查
getArguments()!=空
,如果是,将从那里获取数据。否则变量将为
null
0
false


当我们留下一个片段并调用
onSaveInstanceState()
时,我们可以将数据写入捆绑包,然后可以在
onCreate()中读取数据。但我们也可以将数据写入
getArguments()
并从片段的任何位置读取它们。为什么我们要使用
savedInstanceState
来编写
getArguments()

设置和获取参数实际上对
savedInstanceState
没有任何作用,调用
片段
时,可以为其设置
捆绑
,在
片段
中时,可以使用
getArgument
获取发送到
片段
的内容
savedInstanceState
通常用于在配置更改(如设备旋转)时不想丢失数据的情况。

正如@SinaMN75所说,创建片段时,它可以检查它是在配置更改后恢复还是第一次初始化。屏幕旋转后,可能会出现一些困难,例如,菜单项重复、更改
工具栏
标题。在这种情况下,在
onCreate()
中,我们应该检查
savedInstanceState!=null
并从中读取数据
getArguments()
不会提供有关配置更改的信息


当然,我们应该重写
onSaveInstanceState()
,以保存所需的变量。

这两个选项之间的主要区别是它们的存储位置。参数存储在内存中,但saveInstanceState被序列化到磁盘。 您应该查看此页面:

你想做什么?我的意思是,当附加片段时,您需要从参数中读取参数,或者当发生配置更改时,您想要保存片段的状态?@MrVasilev,我想要在屏幕旋转后保存和恢复数据,在其他情况下:当第一次创建
片段时,当它恢复并从另一个
片段
获取数据时。我的意思是,我们可以在
片段
中的任何地方写入
getArguments()
。如果配置发生更改,我们可以写入
getArguemnts()
,而不是
savedInstanceState
。因此,在所有情况下,我们都可以写入和读取
getArguments()
。它们是多用途的,可以从
片段的任何事件中访问。没错,但使用savedInstanceState还可以保存其他内容。这很有趣。如果你不介意的话,你能解释一下吗?你知道有时候会发生一些意想不到的事情,例如,在我的一个项目中,每当配置发生变化时,菜单膨胀就会再次运行,我的菜单由2个菜单项变成了4个菜单项,我用savedInstanceState解决了此类问题。谢谢,你说得对,我忘了那个问题。我们应该保存到
onSaveInstanceState()
中的
savedInstanceState
,然后在
onCreateView()
中对其进行分析,以检查混淆是否已更改。请用这个想法更新答案,这样我就可以接受了。