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

Jak*_*son 3 java android android-activity

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

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

现在,在每个Activity中,我都会onClickListener()为Facebook按钮创建一个并创建意图并开始活动.每个Activity都有相同的代码.

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

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

UPDATE

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

Ted*_*opp 6

共同的基类可能是最好的方法.(如果您的某些活动扩展了Activity并且某些扩展了Activity子类(例如ListActivity),那么它的效果不是很好.

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

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

UPDATE

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


Bil*_*l K 6

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

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

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

不是继承完全没有!一个很好的解决方案可能是扩展一个控件以启动你的Facebook活动并将其称为facebook按钮 - 让它封装你需要做的所有连接到Facebook的东西.现在你可以将它添加到你想要通过简单的拖动它的任何页面(我敢肯定的Android的工具,让你添加新的组件到托盘).它不像扩展你的活动课那样"免费",但从长远来看,它会减少你的压力.

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

- 编辑,评论回复 -

您可以封装任何您认为自己将在其自己的类中使用的Facebook活动 - 将其设置为最低限度,以便您可以将其添加到单行中的任何类中.

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

您可以将此样板文件设置为最小,例如,如果您需要"标准"功能,则不必执行任何特殊操作,如果您希望禁用Facebook,则可以使用以下命令启动构造函数:

super(DISABLE_FACEBOOK_BEHAVIOR);
Run Code Online (Sandbox Code Playgroud)

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

super(DISABLE_FACEBOOK_BEHAVIOR, ENABLE_TWITTER_BEHAVIOR);
Run Code Online (Sandbox Code Playgroud)

使用像AbstractAction(BehaviorEnum ... behavior)这样的构造函数.

这是更灵活的,你实际上可以说,如果你的活动是一个良好的良心IS-A"行为支持活动".

当然,这是一个非常好的方法,一开始就不那么灵活,稍后当你需要重构成这样的模式时,只需要查看你的继承模型就会导致问题所以你不要让它变得混乱你解决它之前你已经太久了.