2014-09-10 38 views
0

我有一个带有NavigationDrawer的MainActivity。当我点击导航时,会创建一个新的片段。通过点击下一个导航点,旧的被删除,并且新增了一个事务。如何将参数发送到活动的现有隐藏片段

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

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

对不起,我的英语不好。

+0

如果这个文本墙有一些格式,那会很棒。 – 2014-09-10 22:46:20

回答

0

好的,让我看看我是否理解,你有MainActivity和2个片段A和B.当你的MainActivity中的某些事务触发事务时,你想隐藏片段B,并显示片段A.但是,住在片段B到片段A,我说得对吗?

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

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

无论如何,尝试分享一些代码,找出发生了什么。

+0

谢谢你的回答。我找到了解决方案。公共方法无法工作,因为我忘了投下片段。我使用FragmentStack,并从FragmentStack中获取fragmentA。没有投射,我不能称之为公共方法。现在它可以工作。我只需要将FragmentStack的最后一个元素投射到FragmentA。 – Miller 2014-09-26 13:12:54

+0

很高兴我能帮到 – unmultimedio 2014-09-26 16:46:55

0

我曾经通过Activity进行通信(活动寄存器侦听器分段1和分段1调用侦听器方法,然后活动调用分段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使用消息总线与使用的听众和回调方法具有以下优点:

  • 消息始终是一个对象迫使显影剂以相对于多个官能听者方法取向码对象调用
  • 它解耦了不同的组件。发布者和订阅者不必知道彼此。此外,活动(在你的情况下)不必知道任何关于片段之间的通信。将组件解耦将使您的代码更加精简并更易于阅读(和维护)。
  • 它可以被任意组件使用。例如。我用EventBus消息替换了所有LocalBroadcastManager调用(使用LocalBroadcastManager的EventBus速度更快)。如果组件之间无法直接访问(如对话框和首选对象),那么在任意组件之间进行通信尤其方便。

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

我仍然建议重新考虑你的方法,并考虑使用消息总线,而不是在碎片和你的Activity之间来回调用方法。

+0

谢谢,听起来很有趣。我将来会尝试这个。 – Miller 2014-09-26 13:15:38

相关问题