【问题标题】:How to send parameters to existing hidden fragment from activity如何从活动向现有隐藏片段发送参数
【发布时间】:2014-09-10 17:37:36
【问题描述】:

我有一个带有 NavigationDrawer 的 MainActivity。当我单击导航时,会创建一个新片段。通过点击下一个导航点,旧的被移除,新的被添加交易。

有时我会在导航点内打开一个新窗口。在这种情况下,我隐藏旧片段并添加一个新片段。现在我的问题:

我有一个带有editText 的片段A。当我单击此 editText 字段时,将打开一个新的 fragmentB。旧的 fragmentA 将被隐藏。 FragmentB 有一个包含项目的列表。当我单击其中一项时,我想关闭此 fragmentB 并在 fragmentA 的 editText 中填充 listItem 的值。 我尝试了很多东西,但它不起作用。
我使用 Communicator 接口将 listitem 信息传输到 MainActivity。这样可行。但是,从 Mainactivity 到 fragmentA 的方式是个问题。
我不能将项目值与 Bundle 参数放在一起,因为片段 A 已经存在。我试图调用一个存在于 fragmentA 中的公共函数,但是每次我想从 MainActivity 调用这个函数都是不可能的,因为没有这样的函数。我不知道要更新 fragmentA 中的 editText,希望得到帮助。

对不起,我的英语不好。

【问题讨论】:

  • 如果这堵文字墙有一些格式,那就太好了。

标签: java android android-fragments communication


【解决方案1】:

好吧,让我看看我是否理解,你有 MainActivity 和 2 个片段 A 和 B。当 MainActivity 中的某个触发事务时,你想隐藏片段 B,并显示片段 A。而且,传输一些信息生活在片段 B 到片段 A 中,对吗?

然后,我了解到您已经在 MainActivity 中获得了使用接口从 B 传输的信息(这是正确的方法)。现在您无法将该信息传递给片段 A。

在提交事务之前,您必须实例化片段 A,因此在提交之后您可以调用 A 中的公共方法来发送您的信息,对吗?如果这不起作用,那是因为您可能试图在它出现在屏幕上之前发送它。

不管怎样,试着分享一些代码,看看会发生什么。

【讨论】:

  • 感谢您的回答。我找到了解决方案。公共方法无法工作,因为我忘记了投射片段。我使用 FragmentStack 并从 FragmentStack 中获取 fragmentA。如果不强制转换它,我就无法调用公共方法。现在它起作用了。我只需要将 FragmentStack 的最后一个元素转换为 FragmentA。
【解决方案2】:

我曾经通过 Activity 进行通信(Activity 将侦听器注册到 Fragment 1,Fragment 1 调用侦听器方法,然后 Activity 调用 Fragment 2 等)。这可行,但非常麻烦且不灵活)。自从我搬到消息总线后,我再也没有回头。使用消息总线,您可以使用发布 - 订阅模式 (http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) 从任何组件发送到应用程序中的任何其他组件。

我正在使用 EventBus (https://github.com/greenrobot/EventBus),但还有其他实现,例如 Otto (https://github.com/square/otto)。 EventBus 非常稳定(在我的任何应用程序中都没有发生过一次崩溃,而且我有很多用户)并且可靠。

IMO 使用消息总线与使用侦听器和回调方法相比具有以下优点:

  • 与功能更强大的侦听器方法调用相比,消息始终是一个对象,它迫使开发人员编写面向对象的代码
  • 它解耦了不同的组件。发布者和订阅者不必相互了解。此外,Activity(在您的情况下)不必知道有关片段之间通信的任何信息。解耦组件将使您的代码更精简,更易于阅读(和维护)。
  • 它可以被任意组件使用。例如。我用 EventBus 消息替换了所有 LocalBroadcastManager 调用(EventBus 比使用 LocalBroadcastManager 快得多)。如果组件不能直接相互访问(例如 Dialog 和 Preference 对象),那么能够在任意组件之间进行通信尤其方便。

当然应该提到缺点。使用发布 - 订阅模式引入内存泄漏可能“更容易”,因为对象按原样发送并且可以很容易地被引用比它应该更长的时间。

不过,我还是建议重新考虑您的方法并考虑使用消息总线,而不是在片段和您的 Activity 之间来回调用方法。

【讨论】:

  • 谢谢,听起来很有趣。我以后会试试这个。
猜你喜欢
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多