Android - 使用Setters Vs在碎片中传递捆绑包

时间:2016-06-25 09:30:29

标签: android android-fragments

在我的代码中,我使用两种方法将数据传递给新片段。我通过Bundle传递数据,或者有时写setter来传递数据。

两者都很好,没有遇到任何问题。

但是现在,我正在优化我的代码,记住已保存的实例,方向更改或任何其他可能丢失数据的方式。

因此,我心中的确切疑问是,默认情况下,从背景恢复的方向更改/片段是否仍然保持完整通过包发送的数据。或者我们也必须在bundle的情况下使用savedInstance。据我所知,通过setter设置的数据会丢失。

2 个答案:

答案 0 :(得分:5)

每当操作系统需要重新布局视图时,它都会使用已保存的实例状态调用onCreateonCreateView。如果您正在使用构造函数并传递变量,那么您将丢失所设置的任何内容。如果您正在使用捆绑包并使用它直接更改某些变量,则可能会使用捆绑包中的原始值覆盖它们。要解决这个问题,只需在执行突变之前检查捆绑包是否为空。

TLDR:通过方向更改和实例还原,传递的包将保持不变。您可以在onSaveInstanceState

中将额外数据添加到已保存的实例状态包中

答案 1 :(得分:1)

正如您所说,操作系统可以重新创建您的片段(在配置更改或操作系统需要回收内存时),数据将丢失。您可以考虑使用saveInstanceState和将Bundle作为片段的参数传递。

  • 使用bundle作为片段的参数不那么复杂,更容易维护。但是,必须在将片段附加到活动之前设置参数,这意味着您以后不能更改参数。因此,如果您的传递数据已修复,则参数包是最佳选择

  • 如果您的传递数据可以在运行时更改,则setter + saveInstanceState是唯一的方法