接口名称不以“()”结尾。
并且从 Android 文档 View.OnClickListener 被定义为接口。
http://developer.android.com/reference/android/view/View.OnClickListener.html
话虽如此,当我们将“View.OnClickListener”作为参数传递给侦听器时,为什么我们必须结束它“()”,如下所示。
.setOnClickListener(new View.OnClickListener() {
接口名称不以“()”结尾。
并且从 Android 文档 View.OnClickListener 被定义为接口。
http://developer.android.com/reference/android/view/View.OnClickListener.html
话虽如此,当我们将“View.OnClickListener”作为参数传递给侦听器时,为什么我们必须结束它“()”,如下所示。
.setOnClickListener(new View.OnClickListener() {
它是匿名内部类的语法,使您可以同时声明和实例化一个类。
.setOnClickListener(new View.OnClickListener() {
//all methods in the interface implemented here
});
setOnClickListener 采用由 实现的类型的对象,而不是使用该OnClickListener接口创建对象,而是直接实现那里的方法。
它是一个匿名的内部类
假设你有一个按钮
button.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v)
{
}
});
http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
你也可以这样做
button.setOnClickListener(myclicklistener);
OnClickListener myclickListener = new OnClickListener() // now you know why you ()
{
@Override
public void onClick(View v)
{
}
};
引用 java 文档
匿名类表达式包括以下内容:
新运营商
要实现的接口或要扩展的类的名称。
包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:当你实现
一个接口时,没有构造函数,所以你使用一对空
括号,如本例所示。
一个主体,它是一个类声明主体。更具体地说,在正文中,允许方法声明,但不允许声明。
点击监听器是一个接口。
句法
variable.setOnClicklistener(new View.OnClickListener()
{})
这就是我们可以使用 onClicklistener 的方式。
因为我们在这里启动匿名类。因此,接口成为作为参数传递的对象。
你可以这样做:
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick() {
}
};
someView.setOnClickListener(listener);
因为您正在创建一个实现该特定接口的对象。它是对匿名内部类的构造函数调用,您可以通过后面块中的方法定义该内部类。
something.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View invoker)
{
// this is a method specified by the interface. The new Object will have this method implementation
}
});