4

一个关于片段之间通信的设计问题,

为什么有人会使用有点复杂的回调模式来实现侦听器,而不是使用我们想要从中调用方法的类中的简单静态方法(类似于对某些方法/属性使用 Singleton)。是否存在任何性能问题,或者它“只是”Android/Java 的一种糟糕的 OO 编程实践?因此,双向通信的简单方法可能是:

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

4 回答 4

3

如果您有片段/活动的简单用例场景,那么您的解决方案是可行的。不要总是买 Java 纯粹主义者所说的——如果我们都这样做,那么没有人会完成任何事情。有时最好将惯例抛到窗外,做最快、最容易做的事情——尤其是当它是一个小应用程序并且有人付钱给你做的时候。

于 2012-11-27T16:10:10.863 回答
3

使用记录在案的回调和推荐模式的原因是您将使用 Android 框架而不是反对它。使用静态方法完全绕过了这一点,看起来很简单,但在两个层面上存在问题。

首先,从面向对象设计的角度来看,您正在紧密耦合具有非常不同和独立职责的类,这使得它们更难重用和重构。您在片段和活动类中引入的静态方法越多,这个问题就会变得越严重。

其次,您在两种类型的对象的生命周期之外工作,这会给您带来很多痛苦。首先,Fragment 一直被 Android 销毁并重新创建。例如,当您旋转设备并且显示从纵向模式变为横向模式时,您的所有片段都被销毁并再次创建 - 因为在横向中您可能使用不同的片段或在相同的片段中呈现不同的内容。当用户导航到新的活动或不同的应用程序时,片段和活动也可以暂停。

在片段和活动上创建静态方法,您可以随时调用这些方法,您甚至不知道片段或活动是否可见。如果它是当前活动的一部分,您不知道它处于其生命周期的哪个阶段,因此您要么编写大量额外的代码来处理这个问题,要么根本不编写(并且有一个非常错误的应用程序)。

使用回调还意味着在多片段活动中,您可以更轻松地确保替代片段可用于替代布局,并且父 Activity 在决定使用哪个片段后,可以确保来自同级片段的数据被路由到正确的片段.

于 2013-01-14T15:46:00.277 回答
2

最好使用明确指定的通信接口,而不是假设有一个。因此,如果您interface为您的通信定义,那么:

  1. Fragment可以轻松检查父级是否Activity实现此接口,以便Fragment能够传达其需求,
  2. 要定义接口,您需要考虑一下,而不是仅仅开始编码,这会导致某种标准化,这很好,
  3. 维护接口的更新很容易,因为如果您更改接口,编译器会抱怨,但没有实现。

您可能还想阅读这篇 Android SDK 文章

于 2012-09-04T11:50:54.900 回答
1

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

于 2012-09-04T15:04:34.230 回答