关于片段之间通信的设计的一个问题,
为什么有人会使用一个有点复杂的回调模式来实现侦听器,而不是使用一个简单的静态方法(类似于对某些方法/属性使用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();发布于 2012-09-04 19:50:55
最好使用明确指定的通信接口,而不是假设有一个。因此,如果您为通信定义了interface,那么:
Fragment可以很容易地检查父Activity是否实现了这个接口,所以Fragment将能够传达它的需求,您可能还想阅读this Android SDK article。
发布于 2012-11-28 00:10:11
如果你有一个简单的片段/活动的用例场景,那么你的解决方案是可行的。不要总是听信java纯粹主义者所说的话--如果我们都这么做了,谁也做不成任何事。有时最好抛开常规,做最快、最容易做的事情--特别是如果它是一个小应用程序,而且有人付钱让你做。
发布于 2013-01-14 23:46:00
使用文档记录的回调和推荐模式的原因是,您将使用Android框架,而不是反对它。使用静态方法完全绕过了这一点,而且看起来很简单,但在两个层面上都存在问题。
首先,从面向对象的设计角度来看,您紧密耦合了具有完全不同和独立职责的类,这使得它们更难重用和重构。在fragment和activity类中引入的静态方法越多,这个问题就越严重。
其次,你在这两种类型的对象的生命周期之外工作,这会给你带来很多痛苦。首先,Android一直在销毁和重新创建碎片。例如,当你旋转你的设备,显示器从纵向模式变为横向模式时,你的所有碎片都会被销毁并重新创建-因为在横向模式下,你可能会使用不同的碎片或在相同的碎片中呈现不同的内容。当用户导航到新的活动或不同的应用程序时,片段和活动也可以暂停。
在片段和活动上创建静态方法,您可以在任何时候调用这些方法,并且您甚至不知道这样做时片段或活动是否可见。如果它是当前活动的一部分,你就不知道它处于生命周期的哪个阶段,因此你要么要写很多额外的代码来处理这个问题,要么什么都不写(并且有一个非常有buggy的应用程序)。
使用回调还意味着,在多片段活动中,您可以更容易地确保替代片段可用于替代布局,而父活动在决定使用哪个片段后,可以确保来自同级片段的数据被路由到正确的片段。
https://stackoverflow.com/questions/12262769
复制相似问题