Android 中的事件处理 (setOnClickListener)

Event Handling in Android (setOnClickListener)

我是 Java 和 Android 总体开发的新手。我找到了一个使用以下语句的示例。

sButton.setOnClickListener(this);

在实现 View.OnClickListener 的 Activity 的 onCreate() 方法中,其中 sButton 是一个 Button 变量。据我了解,这注册了点击事件处理程序 稍后在示例中

 public void onClick(View v) {
    if(v.getId() == R.id.button_s)
    {
    //some work
    }

这会发生。 我的问题是,如果它使用 activity 内部的 'this' 关键字,它不应该传递 class Activity 的对象吗?如果发生这种情况,则按钮 ID 永远不会匹配。

我知道还有其他方法可以实现按钮点击。

我对 C# 和 Windows Phone 有一点经验。那里的程序是为各个按钮调用方法而不需要注册它们。

还有事件处理程序和侦听器之间的区别是什么?

如有任何帮助,我们将不胜感激!谢谢

一个在下面

Button btn_stop=(Button) findViewById(R.id.btn_stop);
btn_stop.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                }
            }
        });

第二个是通过XML android:onClick="doClick"

下面是 activity

的代码
public void doClick(View v)
{

}

OnClickListener(在本例中为 Activity 实例)用于声明您的应用程序在使用点击事件时的行为。但是,您的应用程序的 Main (UI) 线程会注册所有 (UI) 事件,它会将适当的 View 对象作为参数发送给您的 onClick(View v) 函数。

您提供的代码段 - sButton.setOnClickListener(this) 只是指示您的应用程序使用 Activity 实施中实施的 OnClickListener 来响应用户点击。它不会将 this 实例作为参数转发给 onClick() 函数,Android OS 会这样做。

总之:你的onClick(View v)函数中的View v参数会对应用户点击的View,不管已经附加的OnClickListener View

编辑:This 是(可能过时但)Android 的 View class 方法的 performClick() 源代码。如您所见,在该方法中,如果附加了侦听器,它会调用 mOnClickListener.onClick(this),这就是将已单击的视图转发到适当 onClickListener 对象的 onClick() 方法的方式.

当你这样做时

sButton.setOnClickListener(this);

this 确实是 Activity 的一个实例。但它被声明为

MyActivity extends Activity implements View.OnClickListener

重要的部分是它实现了 setOnClickListener 作为参数的接口。这就是它起作用的原因,this 被视为 OnClickListener,无论是否是 Activity

关于事件处理程序和侦听器之间的区别,请参阅this question