0

接口名称不以“()”结尾。

并且从 Android 文档 View.OnClickListener 被定义为接口。

http://developer.android.com/reference/android/view/View.OnClickListener.html

话虽如此,当我们将“View.OnClickListener”作为参数传递给侦听器时,为什么我们必须结束它“()”,如下所示。

.setOnClickListener(new View.OnClickListener() {
4

5 回答 5

4

它是匿名内部类的语法,使您可以同时声明和实例化一个类。

.setOnClickListener(new View.OnClickListener() {

//all methods in the interface  implemented here

});

setOnClickListener 采用由 实现的类型的对象,而不是使用该OnClickListener接口创建对象,而是直接实现那里的方法。

于 2013-09-27T04:10:51.840 回答
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 文档

匿名类表达式包括以下内容:

  • 新运营商

  • 要实现的接口或要扩展的类的名称。

  • 包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:当你实现
    一个接口时,没有构造函数,所以你使用一对空
    括号,如本例所示。

  • 一个主体,它是一个类声明主体。更具体地说,在正文中,允许方法声明,但不允许声明。

于 2013-09-27T04:13:43.047 回答
1

点击监听器是一个接口。

句法

variable.setOnClicklistener(new View.OnClickListener()
{})

这就是我们可以使用 onClicklistener 的方式。

于 2013-09-27T04:13:55.083 回答
1

因为我们在这里启动匿名类。因此,接口成为作为参数传递的对象。

你可以这样做:

View.OnClickListener listener = new View.OnClickListener() {

    @Override
    public void onClick() {
    }
};
someView.setOnClickListener(listener);
于 2013-09-27T04:14:01.777 回答
1

因为您正在创建一个实现该特定接口的对象。它是对匿名内部类的构造函数调用,您可以通过后面块中的方法定义该内部类。

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
   }
});
于 2013-09-27T04:14:06.063 回答