Android 如果存在getArguments(),我们是否应该在片段中使用savedInstanceState?
在Android片段中,我们可以从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
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()
中对其进行分析,以检查混淆是否已更改。请用这个想法更新答案,这样我就可以接受了。