在Android片段中,我们可以从onCreateView()
或savedInstanceState
的{{1}}获取初始数据。我经常检查它们是否都getArguments()
,然后分配变量。例如,在Kotlin中:
null
因此,首先我检查是否val bundle = savedInstanceState ?: arguments
bundle?.let {
startDate = Date(it.getLong(ARG_START_DATE, 0))
endDate = Date(it.getLong(ARG_END_DATE, startDate.time))
}
,如果可以,则从那里获取数据。如果为null,我将检查savedInstanceState != null
,如果是,则从那里获取数据。否则变量将为null,0或false。
当我们留下一个片段并调用getArguments() != null
时,我们可以将数据写入包中,然后可以在onSaveInstanceState()
中读取它们。但是我们也可以将数据写入onCreateView()
并从片段的任何位置读取它们。我们为什么要使用getArguments()
来写savedInstanceState
?
答案 0 :(得分:1)
设置和获取参数对savedInstanceState
确实没有任何作用,当您调用Fragment
时,可以为其设置Bundle
,并且当您处于{{1 }},您可以使用Fragment
获取发送给Fragment
的内容。 getArgument
通常用于您不希望在配置更改(例如设备旋转)时丢失数据的情况。
答案 1 :(得分:1)
这两个选项的主要区别是它们的存储位置。参数存储在内存中,但saveInstanceState被序列化到磁盘。 您应该看一下此页面: https://developer.android.com/topic/libraries/architecture/saving-states
答案 2 :(得分:0)
正如 @ SinaMN75 所说,在创建片段时,它可以检查它是在配置更改后恢复还是首次初始化。屏幕旋转后,可能会发生一些困难,例如菜单项重复,工具栏标题更改。在这种情况下,在onCreateView()
中,我们应该检查savedInstanceState != null
并从那里读取数据。 getArguments()
不会向我们提供有关配置更改的信息。
当然,我们应该覆盖onSaveInstanceState()
以便保存所需的变量。