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

时间:2011-11-22 16:38:55

标签: java android android-activity

这是一个普遍的问题,但我会给你一个具体的例子。

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

现在,在每个活动中,我为Facebook按钮创建onClickListener()并制作意图并开始活动。每个活动都是相同的代码。

编写此代码一次并将其包含在多个活动中的最佳方法是什么?无论如何包含其他.java文件?

我知道可以使用的一个解决方案是创建扩展CustomActivity的基础Activity类,然后使所有活动扩展CustomActivity。然后将我的onClickListener()代码放入CustomActivity。我是Java的新手,但我不确定这是不是最好的方法。我的一些活动已经按原样扩展了其他自定义活动类,所以扩展更多东西的东西可能会变得有点混乱,我不知道。

更新

在这里扮演魔鬼的拥护者:假设我选择了继承路线并创建了一些CustomActivity,我希望我的活动能够扩展。 CustomActivity将包含我需要用于所有活动的一堆通用代码,包括但不限于Facebook按钮功能。当有一个Activity我需要使用CustomActivity中的通用代码但该特定活动中没有Facebook按钮时会发生什么?

3 个答案:

答案 0 :(得分:5)

通用基类可能是最好的方法。 (如果您的某些活动扩展Activity并且某些扩展Activity子类(例如ListActivity),则它不能很好地工作。

另一种方法是创建一个单独的类来实现点击侦听器的逻辑。这并没有消除所有重复的代码 - 每个活动仍然需要实例化并注册一个监听器 - 但是只需要在监听器类中编写一次该做什么的逻辑。

在任一替代方案中,您可以考虑将android:onClick属性分配给按钮。这样你就不需要注册点击监听器了;你只需要在每个活动中实现目标方法。这对基类方法特别有用。

<强>更新

假设您继续使用继承路由并且您想要一个没有Facebook按钮的活动。如果您使用的是android:onClick技术,那么您不必在代码中执行任何不同的操作 - 因为没有按钮会调用您的onClick方法,因此该方法只会在那里无所事事。如果要在代码中安装OnClickListener,则只需在注册监听器之前测试该按钮是否存在(即findViewById()没有返回null)。

答案 1 :(得分:5)

通常,常见的基类不是最好的方法(虽然它肯定是有效的)。

这让我(以及每个OO程序员“得到”我知道的OO)有一段时间才能真正理解,但你应该尽可能少地使用继承。每次你这样做,你应该问自己是否真的没有其他方法可以做到这一点。

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

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

你现在可能不会相信我,我们都需要从我们自己的经验中学习,只要记住这一点,并随着时间的推移用它来评估你的代码。

- 编辑,评论回复 -

你可以封装任何你认为你会在自己的课堂上大量使用的facebook活动 - 将它降到最低限度,这样你就可以将它添加到一行中的任何类中。

然而,在某些时候,你可能会认为它仍然是太多样板,我完全理解。那时你可以像你建议的那样使用一个抽象的基本活动,但是我不会硬编码它来明确地处理facebook,而是让它支持facebook(以及其他人)等行为,并启用这些行为符合要求。然后,您可以告诉它不要将Facebook行为添加到给定的屏幕,如果您愿意,或者在Twitter中添加其中一些。

你可以使这个样板最小化,例如,如果你想要“标准”功能,你不需要做任何特别的事情,如果你想要禁用facebook,你可能会开始你的构造函数:

super(DISABLE_FACEBOOK_BEHAVIOR);

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

super(DISABLE_FACEBOOK_BEHAVIOR, ENABLE_TWITTER_BEHAVIOR);

使用类似AbstractAction(BehaviorEnum ... behavior)的构造函数。

这是更灵活的,你实际上可以说,如果你的活动是一个明确良心的IS-A“行为支持活动”。

当然,这是一个非常好的方法,一开始就不那么灵活,稍后当你需要重构成这样的模式时,只需要查看你的继承模型就会导致问题所以你不要在修复它之前,让它搞砸了很久。

答案 2 :(得分:0)

绝对。使用继承来获得一些可重用性,就像使用OOP一样。随着您的进步,您会发现在您的活动中会有越来越多的东西需要重复使用 - 比FB按钮的onClickListener更复杂 - 所以开始构建一个是个好主意可以继承的漂亮,可重复使用的“超级”活动。