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

Should we use savedInstanceState in fragments if there are getArguments()?

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

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 是否会从那里获取数据。如果是 null,我将检查 getArguments() != null,如果是,将从那里获取数据。否则变量将为 null0false.

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

设置和获取参数实际上对 savedInstanceState 没有任何作用,当您调用 Fragment 时,您可以为其设置 Bundle 并且当您处于 Fragment 您可以使用 getArgument 获取发送到 Fragment 的内容。 savedInstanceState 通常用于不想在配置更改时丢失数据的情况,例如设备旋转。

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

当然,我们应该覆盖onSaveInstanceState()以保存需要的变量。

这两个选项的主要区别在于它们的存储 location.The 参数存储在内存中,但 saveInstanceState 序列化到磁盘。 你应该看看这个页面: https://developer.android.com/topic/libraries/architecture/saving-states