接口名称不以“()”结尾。
从Android文档中,View.OnClickListener被定义为接口。
http://developer.android.com/reference/android/view/View.OnClickListener.html
话虽如此,当我们将“View.OnClickListener”作为参数传递给侦听器时,为什么我们必须以“()”结束它,如下所示。
.setOnClickListener(new View.OnClickListener() {
答案 0 :(得分:4)
它是Anonymous inner class的语法,允许您同时声明和实例化类。
.setOnClickListener(new View.OnClickListener() {
//all methods in the interface implemented here
});
setOnClickListener
获取由OnClickListener
实现的类型对象,而不是使用该接口创建对象,直接在那里实现方法。
答案 1 :(得分:1)
它是一个匿名的内部类
说你有一个按钮
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文档
匿名类表达式包含以下内容:
新运营商
要实现的接口的名称或要扩展的类。
包含构造函数参数的括号,就像一个
普通类实例创建表达式。注意:实施时
一个接口,没有构造函数,所以你使用一对空的
括号,如本例所示。
一个正文,它是一个类声明体。更具体地说,在 body,方法声明是允许的,但声明不允许。
答案 2 :(得分:1)
单击侦听器是一个界面。
语法
variable.setOnClicklistener(new View.OnClickListener()
{})
这是我们使用onClicklistener的方式。
答案 3 :(得分:1)
因为我们在这里开始匿名课程。因此,接口成为一个作为参数传递的对象。
你可以这样做:
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick() {
}
};
someView.setOnClickListener(listener);
答案 4 :(得分:1)
因为您正在创建实现该特定接口的Object。它是对匿名内部类的构造函数调用,您可以通过后面的块中的方法来定义它。
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
}
});