【问题标题】:DialogFragment calls back to activity, but want activity to update another fragmentDialogFragment 回调activity,但希望activity更新另一个fragment
【发布时间】:2011-07-15 21:11:43
【问题描述】:

如何让我的活动更新它控制的片段?它是这样的,我有一个 DatePickerDialog,当你在 Fragment 中调用它时。我有一个回电活动,让它知道这个 datepickerdialog 完成时选择的日期会传递回所选日期。所以我的活动有它,但我希望调用 DialogFragment 的片段能够访问它,而不是上面的活动。这可能吗?

所以我有这个EditSessionActivity,它调用SessionEdit Fragment。它加载带有 UI 和日期按钮的片段,当单击它时,一个名为 DatePickerDialogFragmentDialogFragment 被启动,这很好用,并回调实现了我写的 OnDialogDoneListnerEditSessionActivity。数据在那里,但我想将该数据推送回SessionEdit 片段以更新其 UI。我该怎么做呢?

今天早些时候,我以为我会很容易地让它工作,试图在这里回答一些问题:

How to create datePicker and timePicker dialogs in fragment class?

意识到上面链接中的我的 UpdateDisplay(来自上面的链接)确实可以像我想要的那样从调用片段中更新按钮文本。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    Fragment 需要与其父 Activity 通信,反之亦然。为两者定义一个接口以符合并允许适当的侦听器订阅事件。例如,我会说任何时候片段想要更改其自身之外的 UI,这应该委托给 Activity。一个 Fragment 不应该知道或关心是否存在其他 Fragment。 (有趣的是,如果 Fragment 想要一个三明治,它应该调用 'sudo make me a sandwich')

    假设这是一个电子邮件客户端,片段希望用户选择一个附件。它应该调用类似 MyParentActivity.selectAttachment(AttachmentSelectedCallback) 的东西。如果这是一个平板电脑,也许 Activity 会调用一个新的片段,让撰写片段可见。如果这是一部手机,可能会启动一个新的 Activity 或将现有的 Fragment 换成附件选择器。

    我考虑 Activity/Fragment 关系的一种方式是微内核的设计方式。 Activity是内核,Fragment是服务。内核管理通信以及启动或关闭服务,但一般来说,服务不应该直接了解彼此。请注意,此设计的性能损失并不总是值得权衡的。

    【讨论】:

    • 这听起来很公平。我认为我获取片段参考的方式存在一些问题。我在这里谈到了它:stackoverflow.com/questions/6729680/… 我不知道,所以如果我想让活动与片段对话,我只需在片段中实现一个监听器? (不确定我的条款是否正确)
    • 是的,你可以定义你想要的任何接口,好像你希望 Fragment 调用 Activity 中的某个方法,传递某种回调作为参数。此回调对象可能包含对 Fragment 的引用。
    • 啊,在问题之间跳来跳去,抱歉。因此,一旦将回调发送回活动,这就是我获取片段中数据的方式,并且如果它有引用并说我的日期按钮是公开的,我可以在那里执行 .setText 并使用选择的对话片段日期。等等……
    • 或者更好的是,不要让它访问你的 Fragment,只给它一个需要更新的 UI 元素的引用。窄接口比宽接口好。
    • 啊,所以回调只包含对我的 ui 元素的引用?
    【解决方案2】:

    如果您在此页面中看到 TitleFragment 示例:http://developer.android.com/guide/topics/fundamentals/fragments.html

    您将看到每次在 TitleFragment 中创建新索引时都会创建 DetailsFragment 的新实例,而不是更新现有 UI 本身。每次要更改视图时,您可能都希望创建片段的新实例。

    【讨论】:

    • 您可以尝试的一件事是覆盖片段中的onResume 方法,以通过从活动中获取数据来更新视图。
    • 您是指 ShowDetails() 中的部分吗?我认为我最大的问题是在片段之间汇集数据,即如何设置选择的日期,而不仅仅是显示或在选择后刷新它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多