有关片段之间通信的设计的一个问题,
为什么有人会使用一些复杂的回调模式来实现监听器, 与使用我们想要调用方法的类中的简单静态方法(某些东西 类似于将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();
答案 0 :(得分:3)
如果您对片段/活动有一个简单的用例场景,那么您的解决方案是可行的。不要总是购买java纯粹主义者所说的 - 如果我们都这样做,没有人会做任何事。有时最好把约会抛到窗外,做最快最简单的事情 - 特别是如果它是一个小应用程序而且有人付钱给你做。
答案 1 :(得分:3)
使用已记录的回调和推荐模式的原因是您将使用Android框架而不是反对它。使用静态方法完全绕过这个并且看起来很简单,但是在两个层面上存在问题。
首先,从面向对象的设计角度来看,您紧密耦合了具有非常不同且独立的职责的类,这使得它们更难以重复使用和重构。您在片段和活动类中引入的静态方法越多,这个问题就会越严重。
其次,你在两种类型的对象的生命周期之外工作,这将给你带来很多痛苦。首先,片段会被Android一直摧毁并重新创建。例如,当您旋转设备并且显示从纵向模式更改为横向模式时,所有片段都会被销毁并再次创建 - 因为在横向中您可能使用不同的片段或在相同的片段中呈现不同的内容。当用户导航到新活动或不同的应用程序时,也可以暂停片段和活动。
在片段和活动上创建静态方法,您可以随时调用这些方法,并且当您这样做时,您不知道片段或活动是否可见。如果它是当前活动的一部分,你不知道它的生命周期的哪个阶段,因此你要么要编写大量额外的代码来处理这个问题,要么根本不编写任何代码(并且非常有用)越野车应用)。
使用回调还意味着在多片段活动中,您可以更轻松地确保替代片段可以用于替代布局,并且已决定使用哪个片段的父Activity可以确保将来自兄弟片段的数据路由到正确的片段。
答案 2 :(得分:2)
最好使用明确指定的通信接口,而不是假设有一个。因此,如果您为通信定义interface
,则:
Fragment
可以轻松检查父Activity
是否实现此目的
界面,所以Fragment
将能够传达其需求,您可能还想阅读this Android SDK article。
答案 3 :(得分:1)
下载最新的Android工具(撰写本文时的SDK r20,工具r14),并使用Eclipse IDE创建一个新的Android应用程序项目(New > Other > Android Application Project
)。在“创建活动”步骤中,选择一个MasterDetailFlow
基础项目。在编写一行代码之前,这将实例化一个具有两个片段(一个ListFragment和一个详细视图)的应用程序,该片段开箱即用。您可以通过主要活动来检查他们的沟通方式。