【发布时间】:2023-04-07 09:00:01
【问题描述】:
当我可以简单地使用时,为什么我应该使用Communicating with Other Fragments 模式
((MyActivity)getActivity()).doFoo();
在我的Fragment?
【问题讨论】:
-
一个很好的问题。在我看来,你很快就会得到很高的分数。
当我可以简单地使用时,为什么我应该使用Communicating with Other Fragments 模式
((MyActivity)getActivity()).doFoo();
在我的Fragment?
【问题讨论】:
这归根结底是coupling 和可重用性的问题。
如果您使用您在问题中发布的代码示例,则您的 Fragment 不能在其他活动中重复使用。它是'tightly coupled'。如果您自己工作并且您认为以后没有人可能会使用或阅读您的代码(包括您自己),那很好,并且您绝对不需要在其他任何地方使用 Fragment .但一般来说,您仍然应该使用正确的模式,只是为了养成使用它的习惯。
如果您在公司中担任职位编码,保持“松散耦合”从长远来看将对您和您的同事有很大帮助,这意味着您可以直接返回您的代码并在以后重新使用它如果需要的话。
【讨论】:
当您调用((MyActivity)getActivity()).doFoo() 时,您就是downcasting 您的对象,如果包含的Activity 不是MyActivity 的实例,您可能会遇到RuntimeException。直接调用意味着Fragment与Activity紧密耦合。很多人相信this is not a good thing。
当您实现链接中描述的接口时,您将无法构建您的应用程序,除非您传递一个已实现它的对象。
这意味着如果您在其他地方使用该片段,您将消除RuntimeException 的风险,因为它是强类型的。
有个问题here explaining why strong typing is good and tight coupling is bad
【讨论】:
因为它创建了 Fragment 和 Activity 的强直接耦合,从而降低了 Fragment 的可重用性:您只能将它与此 Activity 一起使用。
使用接口来调解通信更加灵活,现在可以嵌入您的 Fragment 多个活动,它们只需要实现通信接口。
这在程序执行方面是等效的,但它是一个更好的设计,与Observable-Observer design pattern 非常接近。
另请注意,它们是替代解决方案:
这些解决方案更加简洁,代码更加优雅。
【讨论】:
片段之间的通信应该只通过活动。 ((MyActivity)getActivity()).doFoo() - 会在activity中调用一个方法然后更新另一个fragment
Fragment 只能由 Activity 控制。说..如果一个片段有直接的方式与另一个片段进行通信,那么有可能一个片段可以在没有活动感知的情况下与其他片段分离。
【讨论】: