View.OnClickListener,能解释一下吗?

6

如果这个问题对您来说可能很愚蠢,对不起,但我是Android编程新手,我无法理解Java语法。

您能逐步解释一下这行代码正在发生什么吗?

View.OnClickListener ourOnClickListener = new View.OnClickListener() {
       @Override
       public void onClick(View v){
       ourMessage.setText(“The button got tapped”);
       }
   };

1
阅读有关匿名内部类的内容,你就会明白。 - Suresh Atta
1个回答

14

View类中声明了一个接口,叫做OnClickListener,它在View.java源文件中长这样:

/**
* 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);
}

通常你需要创建一个类,并让它实现这个接口:

public void MyClass implements View.OnClickListener {

  @Override
  public void onClick(View view) {
    // do stuff
  }
}

但有时您不需要在单独的文件中使用此类。相反,您可以创建匿名内部类,就像创建新类一样,其中只有接口指定的方法:

new View.OnClickListener() {
       @Override
       public void onClick(View v){
           ourMessage.setText(“The button got tapped”);
       }
}

您可以随时使用此类的实例,以替代需要 View.OnClickListener 接口的地方。

另外需要提醒的是,匿名内部类将会持有创建它的外部类的引用。因此,下面的代码是合法且有效的:

public class MyClass {

  private int clicksCount = 0;

  private View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      clicksCount += 1;
    }
  }
}

在这里,你可以访问clicksCount字段,它是MyClass的一个字段,甚至可以从实现OnClickListener接口的内部类中访问。顺便提一下,如果你想访问一个变量,你需要给它添加final修饰符:

public void testMethod(final int canAccess, int cantAccess) {
  final String test = otherView.getText().toString();
  myView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      // Cannot access cantAccess, because it's not final
      if (test.length == 0) { // can access
        // do something
      }
    }
}

1
完美的解释 - frogatto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接