它可以让您重用事件处理程序,例如 OnClick 方法,在您的情况下,View 参数是触发该方法的 Button 实例 - 多个按钮可以具有相同的 OnClick 处理程序,在方法内您可以检查哪个按钮具有解雇(如果有多个)并做出相应反应。
实际上,这对于事件驱动编程来说非常典型,不仅在 Android 上,而且在所有当代 UI 编程(iOS、Windows、OS/X 等)上都是如此。
还有一点更多:参数的类型是 View 而不是 Button,因为不仅 Button 对 OnClick 做出反应,而且对 OnClick 做出反应的 UI 对象的常见类型也是 View。
现在,您不仅可以以不同的方式处理事件,还可以直接访问事件的源,以便您可以处理它 - 在按钮的示例中,您可以更改其标题,并且您确信您正在更改触发该事件的 UI 对象的标题。
所以以这种方式来做事件驱动的 API 是很有意义的。
UPDATE
注册事件处理程序(或 Android 世界中的 ClickListener)的方法之一是直接在布局中将方法名称分配给 onClick 属性 - 当然前提是该方法具有正确的签名,即期望有一个类型的参数View
并且有void
返回类型 - 您可以在其他答案中看到示例。
另一种是分配一个匿名内部类作为监听器,如下所示:
findViewById(R.id.someButton).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
doSomething();
}
});
您还可以有一个实现类的实例View.OnClickListener
接口,甚至“Activity”本身也可以做到这一点,然后将其注册为监听器。
事实上,它们的工作原理都是一样的——有一个类的实例实现View.OnClickListener
在按钮实例中注册的接口中,按钮(或与此相关的视图)识别其边界内的单击并调用传递自身的侦听器(this
) 给听者。
我个人认为第三种方法是最糟糕的——类中只能有一种名称方法,但布局中有许多按钮,因此所有这些都需要使用条件代码来处理。
第一个很好,因为您可以直观地设置它,但考虑到它全部在 XML 文件中,并且您可以为一个活动拥有多个布局,因此在较大的项目中控制它可能会很混乱。
因此,我最喜欢的是第二个 - 它允许您将所有逻辑保留在代码中的一个位置,例如,如果您在onCreate
活动的方法。