片段-活动通信和片段间通信

4
关于Fragment之间通信的设计问题,有一个疑问:为什么有些人使用相对复杂的回调模式来实现监听器,而不是直接使用类的静态方法调用方法(类似于某些方法/属性使用单例)?是否有性能问题,或者这只是一种“糟糕”的Android / Java面向对象编程实践?因此,两个方向进行简单通信的方法可能是:
MyActivity activity
    Fragment A
    Fragment B
static method canBeCalledFromAnywhere() {}
method activityMethod()
    call FragmentA.doSomething();
    call FragmentB.doSomething();



FragmentA
    onCreate()
        onMe = this;

static method doSomething()
    do something with static or use onMe for instance;

method oneMethodFragmentA()
    call MyActivity.canBeCalledFromAnywhere();



FragmentB
onCreate()
    onMe = this;

static method doSomething()
    do something with static or use onMe for instance;

method oneMethodFragmentB()
    call MyActivity.canBeCalledFromAnywhere();
4个回答

3
使用记录的回调函数和推荐的模式的原因是你将与Android框架一起工作,而不是反对它。完全绕过这些并使用静态方法看起来很简单,但有两个问题。
首先,从面向对象设计的角度来看,你正在紧密地耦合具有非常不同和独立职责的类,使它们更难以重用和重构。引入越多静态方法到你的片段和活动类中,这个问题就会变得越糟。
其次,你正在为这两种类型的对象工作周期之外,这将给你带来很多痛苦。首先,片段在Android中经常被销毁和重新创建。例如,当你旋转设备并且显示从竖屏模式变为横屏模式时,所有的片段都会被销毁并重新创建 - 因为在横屏模式下,你可能会使用不同的片段或在同一片段中渲染不同的内容。片段和活动也可以在用户导航到新活动或不同应用程序时暂停。
在片段和活动上创建静态方法,你可以在任何时候调用这些方法,你甚至不知道片段或活动是否可见。如果它是当前活动的一部分,你不知道它处于生命周期的哪个阶段,因此你要么写很多额外的代码来处理这个问题,要么根本不写(并且有一个非常有缺陷的应用程序)。
使用回调还意味着在多片段活动中,你可以更轻松地确保替代片段可用于替代布局,并且父活动可以决定使用哪个片段,并确保从兄弟片段传递的数据路由到正确的片段。

3
如果您的碎片/活动只有简单的用例场景,那么您的解决方案是可行的。不要总是相信Java纯粹主义者所说的话 - 如果我们都这么做,就永远不会有什么进展了。有时最好抛弃传统方法,做最快、最容易的事情 - 特别是如果这是一个小应用程序,有人付钱给您做它。

我喜欢这个答案,因为这是我在大多数小型到中型项目中的做法。但是,我会选择接受WebnetMobile.com的答案作为最详细的答案。 - miroslavign
事实上,这个简单的用例已经被大多数人采用了,开发Android应用程序已经占用了很多时间。加一分 :) - Plain_Dude_Sleeping_Alone

2
最好使用明确定义的通信接口,而不是假设有一个。因此,如果您为通信定义了interface,则:
  1. 您的Fragment可以轻松检查父Activity是否实现了此接口,因此Fragment将能够传达其需求,
  2. 要定义接口,您需要认真考虑一下,而不是只是开始编码,这会导致某种程度的标准化,这是好的,
  3. 很容易维护接口的更新,因为如果您更改接口但没有实现,则编译器会发出警告。
您可能还想阅读此Android SDK文章

谢谢您的评论,正如我所建议的那样,这只是一个不太好的面向对象编程实践。接口是三个不错的选择。 - miroslavign
没错。即使这意味着更长的开发时间,以正确的方式完成开发工作也会有所裨益。良好的编码习惯也是一个加分项。如果这回答了你的问题,请参考:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 - Marcin Orlowski
是的,这是我预期的答案之一,但在“关闭”此答案之前,我真的很想看到更多的想法/意见。 - miroslavign

1

下载最新的Android工具(SDK r20,截至本文撰写时的工具r14),并使用Eclipse IDE创建一个新的Android应用程序项目(New > Other > Android Application Project)。在“创建Activity”步骤中,选择一个MasterDetailFlow基础项目。这将实例化一个带有两个片段(ListFragment和详细视图)的应用程序,可以在编写一行代码之前立即使用。您可以查看它们如何通过主Activity进行通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接