【问题标题】:Android - Why is using an Interface considered the best practice of communicating between Activity and Fragment?Android - 为什么使用接口被认为是 Activity 和 Fragment 之间通信的最佳实践?
【发布时间】:2015-05-11 01:38:36
【问题描述】:

在此文档"Communicating with Other Fragments" 中,Google 告诉我们,交流 Activity 和 Fragment 的最佳做法是实现接口。然后这个接口可以被 Fragment 调用并在 Activity 中执行必要的行为。

但也有一种破解方法可以做到这一点。直接通过"getActivity()"方法获取Activity,然后我们就可以使用它下面的所有"public method"了。

这让我很困惑。因为我真的想不出使用 hack 方式来做这件事有什么严重的缺点。

我想到第一种方法的好处是:

  1. 我可以将“资源可访问性”限制在我的 Activity 下。但是由于 Fragment 能够调用“getActivity()”,那么它实际上可以访问其中的所有“公共”方法。所以这并不能真正说服我。
  2. 代码更具可读性和故事性。对于第一种方法,代码告诉我们“这个Activity只为Fragment打开这些特定的可访问区域”。我们可以直接通过查看Activity中的代码知道“Fragment里面有什么可能会干扰Activity”。否则,我们需要打开 Fragment 下的代码,看看它做了什么。

好吧,我把这些总结出来之后,我自己有点信服了。但坦率地说,我真的想要一些其他的固体,并且必须有这样做的理由。任何想法或文档将不胜感激!

【问题讨论】:

  • @QuentinTsai:你看到我的回答了吗?
  • @ZygoteInit 是的!对不起,我的回复晚了,我之前生病了。我已经浏览了您所有的答案,它们都非常有帮助。但是很抱歉,我可能会给 Reinier 一个正确的答案,因为对我来说,它真的让我想起了一些我以前没有注意到的事情。谢谢大家!!

标签: java android android-activity android-fragments interface


【解决方案1】:

最重要的是,主要优势是代码的模块化。当您直接从“子”类调用您的“父”类时,您创建了一个cyclic dependency。这实际上意味着您不能在不更改另一个的情况下更换一个。这种方法经常导致难以维护的意大利面条式代码,更难以扩展,如果不进行大量重构工作几乎不可能替换。

至于您的示例:如果您直接从 Fragment 调用 Activity 的公共方法,则您将无法在其他活动中重用您的 Fragment 而不实施 hacky 解决方案(如 if(getActivity() instanceof A) {...} else {...}) ,你也不能把你的活动换成例如控制器类,或您想出的任何其他解决方案。

如果你在理解这个问题上有困难,我强烈建议你阅读本书Effective Java

【讨论】:

    【解决方案2】:

    除此之外,这种方法没有固有的“优势”

    • 这是一个可识别的成语。使用接口是常见的方式 哪两个类在 Java 中相互通信。
    • 相同的代码可以在许多不同的Fragments 和Activitys 中重复使用。
    • 它遵循模块化和抽象的一般原则,其中Fragment“告诉”Activity 它已达到某个状态,Activity 确定与此状态相关的自己的行为。李>

    【讨论】:

    • 我认为第二个应该是“相同的fragment 可以从更多activities 中使用”(这可以在getActivity() 之后完成,但随后进行instanceof 检查和强制转换...... )
    • @ZygoteInit 已经做到了!正如你给出这个答案!我立马点赞!谢谢:)!!
    【解决方案3】:

    我认为基于接口的方法的主要优势在于其众所周知且可读的模块化以及从软件工程的角度来看足够高级别的抽象。

    假设你在一个团队工作中,每个团队成员负责其中一个组件,例如,假设你应该实现那个片段,我应该实现那个活动。因此,由于我们彼此相距太远,我们应该就共享接口作为我们之间的标准达成一致,然后我们应该实现符合该标准的组件,在这种情况下是我们约定的接口。同样在软件工程考虑中,基于组件的软件系统由许多彼此独立操作的组件组成,它们的交互仅通过标准共享接口完成,每个组件内的材料对其他人是透明的 p>

    因此,在您的情况下,ActivityFragment 应被视为两个独立的组件,并且每个组件都不知道另一个组件的详细信息。这里出现了 Java 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多