View.OnClickListener,你能解释一下吗?

时间:2015-09-26 18:32:07

标签: java android

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

您能逐步解释这行代码的发生情况吗?

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

1 个答案:

答案 0 :(得分:12)

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
      }
    }
}