Android - 如何避免活动之间的重复代码

问题描述:

这是一个普遍的问题,但我会给你一个具体的例子。Android - 如何避免活动之间的重复代码

我有一个App一堆活动。在所有的活动中,都有一个Facebook按钮。当你点击该按钮时,它会将你带到一个特定的Facebook页面。我希望按钮在每个页面上的行为都完全相同。

眼下,在每一个活动,我创建Facebook的按钮的onClickListener(),使意向,并开始活动。每个Activity中都有相同的代码。

什么是一次写这样的代码,并将其包含在多个活动的最佳方式是什么?有没有反正包括其他.java文件?

我所知道的一种解决方法是使Activity的基类CustomActivity继续延伸,然后所有活动延伸到CustomActivity。然后把我的onClickListener()代码放在CustomActivity。虽然我是Java新手,但我不确定这是否是最好的方法。我的一些活动已经扩展了其他自定义活动类,因此扩展可以扩展更多内容的东西可能会比较麻烦,我不知道。

UPDATE

这里玩魔鬼代言人:可以说,我去与继承路线和我创造一些CustomActivity,我想我的活动延长。 CustomActivity将包含一堆我需要用于所有活动的通用代码,包括但不限于Facebook按钮功能。当有一个活动需要使用CustomActivity中的通用代码但该特定活动中没有Facebook按钮时会发生什么?

公共基类也许是最好的办法。 (如果你的一些活动扩展了Activity和一些扩展的Activity子类(比如ListActivity),那么它的效果就不那么好了。

另一种方法是创建一个单独的类来实现你的点击监听器的逻辑。不消除所有重复的代码—每个活动还需要实例化和注册监听器—但逻辑适合做什么会只需要在监听器类写一次。

在这两种选择,你可能会考虑分配属性为按钮,这样你不需要注册一个点击监听器,你只需要在每个活动中实现目标方法,这对于t他基地级的方法。

UPDATE

假设你去继承路线,你想,没有Facebook的按钮的活动。如果您使用的是技术,那么你就没有做任何事情在不同的代码—因为没有按钮将调用您的onClick方法,该方法将只是坐在那里什么都不做。如果您要在代码中安装OnClickListener,则只需在注册侦听器之前测试该按钮是否存在(即findViewById()未返回null)。

+0

更新的问题 –

+0

@Jakobud - 最后回答 –

+0

有趣的做法。谢谢! –

好,延长东西是OOP的原则,所以我不认为这是有子类的不止一个层次的问题。你认为的解决方案在我看来是最好的。

绝对。和OOP一样,使用继承来获得一些可重用性。随着您的进步,您会发现您的活动中会有越来越多的事情需要重用 - 比FB按钮的onClickListener更复杂 - 因此,开始构建一个好主意很好,可重用的“超级”活动,你可以继承。

一般公共基类是不是最好的方法(虽然它肯定是有效的)。

这花了我(和每一个OO程序员谁“获得” OO我所知道的)一段时间才能真正神交,但你应该谨慎作为,你可能可以使用继承。每当你这样做,你应该问自己,是否真的没有其他方式来做到这一点。

找到的一种方法是对“is-a”测试非常严格 - 如果您将基本活动称为“Facebook活动”,您真的可以说每个孩子都是“Facebook活动”吗?可能不会。另外,如果您决定将Twitter添加到某些页面(但不是其他页面),那么您如何做到这一点?

这并不是说继承完全是出于!一个很好的解决方案可能是扩展一个控件来启动你的Facebook活动并将其称为一个Facebook按钮 - 让它封装你需要做的所有连接到Facebook的东西。现在你可以通过简单的拖拽将它添加到你想要的任何页面上(我非常确定,安卓工具可以让你将新的组件添加到托盘中)。它不像扩展你的活动课程那样是“免费”的,但从长远来看,它会让你的压力减少很多。

你可能不会相信我现在,我们都需要从我们自己的经验中学习,只是记住这一点,并把它作为你演变过来的时间来评估你的代码。

--edit,评论response--

可以封装你认为你会在它自己的类中使用了很多Facebook的任何活动 - 它让到最低限度所以你可以将它添加到任何类在一个班轮中。

在某一点上,不过,你可能会决定,它仍然是太多了样板,我完全理解。在这一点上,你可以使用一个抽象的基本活动,就像你所建议的那样,但我不会硬编码它来明确处理Facebook,而是支持Facebook(也许还有其他)的行为,并打开这些行为如所需。如果你愿意,你可以告诉它不要将facebook行为添加到给定的屏幕,或者在Twitter中添加其中的一些。

,如果你想“标准”功能,你可以让这个样板最低,例如,你不应该做任何特殊,如果您希望禁用Facebook的你可能会开始你的构造:

super(DISABLE_FACEBOOK_BEHAVIOR); 

,如果你想要一个也使Twitter的,你可以使用:

super(DISABLE_FACEBOOK_BEHAVIOR, ENABLE_TWITTER_BEHAVIOR); 

与像AbstractAction(BehaviorEnum ...行为)构造函数。

这比较灵活,你可以说每个人如果你的活动是一个“行为支持活动”,并有良知。

当然,这是一个非常好的方法,一开始就不那么灵活,后来在需要时重构成这样的模式,只是在寻找导致问题的继承模型时,不要让它在你修复它之前弄乱你太久。

+0

你有一些好点。我最初担心的是继承问题,因为当我在某个Activity中没有Facebook按钮时会发生什么,但我仍然需要使用'FacebookActivity'类的其他方面...... –