在学习android中的事件处理时,我遇到了以下代码
以下是我的几个问题
1)为什么一个匿名类的实例正在实现 View.OnClickListener()接口作为参数传递给 setOnClickListener()?
2)将此实例作为参数传递有什么好处?
Button button = (Button) findViewById(R.id.button_send);
button.setOnClickListener(new View.OnClickListener() // explain this {
public void onClick(View v) {
// Do something in response to button click
}});
答案 0 :(得分:1)
目标:您希望在用户点击按钮时执行某些操作。
您需要什么:您需要知道用户何时点击该按钮。
您如何知道:使用此View.OnClickListener
界面。
这是View.OnClickListener
:
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
这类似于将方法A传递给另一个方法B,并且方法B在特定事件发生时调用方法A.
在这个View.OnClickListener
的情况下,当用户点击按钮时,会调用您传递的方法。
从技术上讲,您实现View.OnClickListener
并动态创建它的实例并将其传递给方法setOnClickListener()
。
当用户点击按钮时,将调用onClick(View v)
方法。因此,只要用户点击按钮,onClick(View v)
方法中的代码就会被执行。
答案 1 :(得分:0)
您没有传递接口(View.OnClickListener
),而是传递该接口的实现的实例。
该实例通常是匿名的,因为创建它的命名(可能是最终的)实例基本上是无用的;它唯一可能被使用的地方是作为单个二传手的参数。为了创建命名实例而创建的接口的任何实现都可能封装特定于组件的行为,这些行为对于作为命名类公开是没有意义的。
this SO answer中解释了这一点。