对许多按钮实施OnClickListener接口的正确方法是什么


10

我的Android活动包含多个按钮,都需要一个OnClickListener。我已经看到许多不同的方法,例如:

  • 在活动类中实现接口
  • 创建一个单独的类来实现接口
  • 为每个按钮定义一个匿名内部类。

我已经看到了每种方法的许多示例。但是,我不清楚为什么要使用一种方法代替另一种方法。这些方法之间的差异是否在风格上有所不同,还是有理由使一种方法更好?

Answers:


6

与许多事情一样,正确的方法取决于您要为特定按钮执行的操作以及对活动进行的其他操作。

Activity类实现interface
当调用此侦听器时只有一种类型的任务要执行时,这是一个不错的选择。一个简单的例子就是带有多个字段和一个保存按钮的简单表单。我不想让我的事件侦听器检查事件的源,以便确定实际需要执行的操作。我知道有人可能说这是一种风格,但是我相信通过不要求侦听器执行此检查,可以使代码更易于遵循,因为您将确切地知道每个事件都在调用什么。

一个不同的类实现接口
如上所述,当我有多个可以触发同一事件的项目时,我更喜欢使用此选项。扩展上面的示例,让我们添加一个清除按钮,该按钮也需要单击侦听器。创建一个执行保存操作的侦听器,并执行清除操作的侦听器。每个侦听器仅添加到将产生该动作的组件中。

如果您愿意的话,此实现还可以利用其他好处。好处是,它可以防止其他类触发您的活动类内部的事件。由于接口方法必须是公共的,因此任何引用该类的人都可以触发该事件。如果您希望对谁可以在应用程序中执行的操作进行细粒度的控制,可以使用单独的类来防止任何引用活动的人触发您的表单被清除或保存(如果侦听器使用了源代码,则可能破坏代码,但是无法处理错误的输入)。

匿名内部类实现接口
这实际上只是构造使用不同类作为实现的第二种选择的一种特定方法。此选项甚至可以进一步限制谁有权触发事件,因为没有其他人可以创建该类的实例。但是,我认为这两个选项之间最重要的因素是要完成多少工作。清除几个文本字段是一种简单直接的操作。但是,保存for的过程可能涉及许多任务,例如,您正在验证输入(您应该这样做),写入数据库以存储值并触发一些后保存操作。在这种情况下,使用自己的文件创建单独的类将在输入表单和数据处理之间提供更清晰的划分。反过来,这将保留表单代码,而不是其中嵌套了多个内部类的更大文件。


哇,谢谢你的回复 就开销而言,创建多个侦听器类是否更昂贵?
slayton

@slayton:无论您做什么,总会有费用。问题应该是“差异对您重要吗?” 制造更多的对象很重要,但是如果您的侦听器必须遍历源列表来决定实际执行的操作,则执行时间将更长。如果内存使用和性能对您很重要,则应分析代码并根据您的要求确定最佳的代码。但是,我会怀疑这是否会成为您代码的瓶颈。除非另有说明,否则请做出决定,使代码更清晰,组织更好。
unholysampler 2011年

3

第四种方法是在布局中设置onClick属性:

<Button android:onClick="clickHandlerForButtonX" />

在Activity中具有以下相应方法:

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

有趣的是,我不知道你能做到。尽管这似乎是处理按钮单击的Android特定机制。
slayton

不过,我通常会使用“活动类实现接口”,那样,您就可以在同一位置获得所有与点击相关的内容。
orjan 2011年

此特定方法不适用于片段。
拉胡尔·蒂瓦里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.