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

时间:2018-09-11 09:02:36

标签: android android-fragments onsaveinstancestate

在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

3 个答案:

答案 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()以便保存所需的变量。