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。
我是 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。