Answers:
与许多事情一样,正确的方法取决于您要为特定按钮执行的操作以及对活动进行的其他操作。
Activity类实现interface:
当调用此侦听器时只有一种类型的任务要执行时,这是一个不错的选择。一个简单的例子就是带有多个字段和一个保存按钮的简单表单。我不想让我的事件侦听器检查事件的源,以便确定实际需要执行的操作。我知道有人可能说这是一种风格,但是我相信通过不要求侦听器执行此检查,可以使代码更易于遵循,因为您将确切地知道每个事件都在调用什么。
一个不同的类实现接口:
如上所述,当我有多个可以触发同一事件的项目时,我更喜欢使用此选项。扩展上面的示例,让我们添加一个清除按钮,该按钮也需要单击侦听器。创建一个执行保存操作的侦听器,并执行清除操作的侦听器。每个侦听器仅添加到将产生该动作的组件中。
如果您愿意的话,此实现还可以利用其他好处。好处是,它可以防止其他类触发您的活动类内部的事件。由于接口方法必须是公共的,因此任何引用该类的人都可以触发该事件。如果您希望对谁可以在应用程序中执行的操作进行细粒度的控制,可以使用单独的类来防止任何引用活动的人触发您的表单被清除或保存(如果侦听器使用了源代码,则可能破坏代码,但是无法处理错误的输入)。
匿名内部类实现接口:
这实际上只是构造使用不同类作为实现的第二种选择的一种特定方法。此选项甚至可以进一步限制谁有权触发事件,因为没有其他人可以创建该类的实例。但是,我认为这两个选项之间最重要的因素是要完成多少工作。清除几个文本字段是一种简单直接的操作。但是,保存for的过程可能涉及许多任务,例如,您正在验证输入(您应该这样做),写入数据库以存储值并触发一些后保存操作。在这种情况下,使用自己的文件创建单独的类将在输入表单和数据处理之间提供更清晰的划分。反过来,这将保留表单代码,而不是其中嵌套了多个内部类的更大文件。
第四种方法是在布局中设置onClick属性:
<Button android:onClick="clickHandlerForButtonX" />
在Activity中具有以下相应方法:
public void clickHandlerForButtonX(View v) {
//Handle Button X here
}