【问题标题】:Is it wrong to put data in extra while in fragment?在片段中额外放入数据是错误的吗?
【发布时间】:2022-02-23 07:07:26
【问题描述】:

我有一个 Activity,并希望在该 Activity 和 Fragment 之间共享数据。我在片段中额外放入数据,并将其他数据放入其中。这样我在我的应用程序中有一个共享的捆绑包。我只看到将 Bundle 传递给 Intent 的示例,但也可以在另一个片段中更改该数据。这并没有打破碎片的自包含。我不会将它们放在活动中的某种方法中,因为那样您就必须进行活动。谁能告诉我这样做的权利?我知道共享首选项,但我不想要基于文件的解决方案。我知道使用 newInStance 传递参数,但我还需要将数据保存回片段中。传递参数只转发不共享。

【问题讨论】:

    标签: android android-intent shared


    【解决方案1】:

    使用 Bundle 来回传递活动/片段中的数据会有一些限制和问题,例如:

    • 要传递复杂对象,您需要使用带有键标记的可序列化对象。
    • 将共享密钥保存在不同的部分可能会导致运行时 如果密钥错误,则会出现错误或数据丢失。

    • 不推荐序列化对象,但可以使用 Parcelables 解决。但是对于复杂的对象check here 来说,维护这一点并不容易,您需要针对不同类型的对象进行自定义。

    • 您仍然不会在不同片段之间共享数据,但它们只是被传输;并且在您转到应用的新部分时需要一遍又一遍地传输。

    • 如果重新创建活动,不保证保留数据。

    您可以通过 MVVM 结构使用 ViewModels,而不是:

    • 数据可以在不同级别的生命周期范围内共享;这意味着如果 ViewModel 是通过 ViewModelProvider 在活动中实例化的;然后可以在活动的任何部分或底层片段中访问它。如果您只想保留任何片段及其底层片段之间共享的数据;您应该将 ViewModel 实例化绑定到该片段。

    • ViewModel 在所有者中实例化一次,并在从属片段中访问,无需重新实例化。

    • 如果重新创建活动,它会收到所有者创建的相同ViewModel 实例,并且视图的数据不会丢失。

    • 当所有者活动/片段完成后,框架会自动调用 ViewModel 的onCleared() 方法,以便清理资源。

    Here 是您要检查的代码实验室。

    【讨论】:

    • 很好的解释。是的,我尝试了 Viewmodel,但无法正常工作。我可以使用 Viewmodel 设置数据,但如何获取数据?观察者是由变化触发的。那不是我需要的。它是一种完全不同的共享数据的方式,它是发布者/订阅者的方式。 Activity 重新启动时丢失的数据不是问题。它只支持纵向,因为转动屏幕会导致 Activity 重新启动。
    • @HermanVanDerBlom 是的,观察者与众不同。您通常使用 getter 获取数据,使用 setter 设置它们;类似viewmodel.get(foo)viewmodel.set(foo)
    • 这对我来说不适用于 setter/getter。据我所知,您需要 LiveData。看了 Lab,它的 Kotlin。我做 Java 和 C#、C、C++
    • LiveData 仅更新处于活动生命周期状态的应用组件观察者。当我开始一个新片段时,我想阅读 ViewModel 并想知道哪个用户已登录。但是我不会在观察者中收到通知,因为当时该片段未处于活动状态。它让我想到了在 Activity 中创建所有必要的片段,并且可能不是按需的。那么它应该可以工作了。
    • 是的,你是对的,不过我没有在答案中提到实时数据; Kotlin/Java 在 getter/setter 方法中的工作方式相同,我已经尝试过了.. 不确定 C 语言
    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2015-09-17
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多