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

标签 java android

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

你能一步步解释这行代码发生了什么吗?

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

最佳答案

View类中声明了一个接口(interface),它是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);
}

通常你会创建一个类,并让它实现这个接口(interface):

public void MyClass implements View.OnClickListener {

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

但有时您不需要将此类放在单独的文件中。相反,您可以创建匿名内部类,这就像创建新类一样,只有方法是来自指定接口(interface)的方法:

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

然后,您可以在需要 View.OnClickListener 接口(interface)的任何地方使用此类的实例。

还值得一提的是,匿名内部类 将保存对您在其中创建它的类的引用。所以这将是合法有效的:

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

关于java - View.OnClickListener,你能解释一下吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32800603/

相关文章:

java - PC 和 Android 之间的数据同步应用程序?

java - 如何使用jsp显示excel避免 "No input source supplied to the exporter"。?

java - Android 上的 HTTPS 身份验证

Java Swing CardLayout : get componente associated to a String

java - 使用 Android SIP 堆栈注册 SIP 配置文件

java - 继承log4j记录器

android - 如何在我们的应用程序 android+phonegap+JQM 中打开 pdf 文件?

android - 如何在图形布局android studio中的Attributes下添加font Family属性

java - Android Studio 给出了多余的 Actor 警告,但它并不是真的多余

android - 如何在 Windows 操作系统中查看 Android 源代码?