Android 请解释一下这个结构,为什么会这样使用?

Android 请解释一下这个结构,为什么会这样使用?,android,email,Android,Email,我在[本教程][1]中找到了下面的代码段。我不明白到底发生了什么。看起来按钮被创建了,然后一个侦听器被设置为在单击时侦听,但是为什么整个onClickView方法都在。。。sendMail.setOnClickListener的 关于setOnClickListener,Eclipse表示: 注册在单击此视图时要调用的回调。如果此视图不可单击,则它将变为可单击 那么,我说的结构就是几乎同时看到按钮是否可点击,如果不可点击,则使其可点击,并为按钮创建一个侦听器,这对吗 但我仍然不明白为什么它是这样

我在[本教程][1]中找到了下面的代码段。我不明白到底发生了什么。看起来按钮被创建了,然后一个侦听器被设置为在单击时侦听,但是为什么整个onClickView方法都在。。。sendMail.setOnClickListener的

关于setOnClickListener,Eclipse表示:

注册在单击此视图时要调用的回调。如果此视图不可单击,则它将变为可单击

那么,我说的结构就是几乎同时看到按钮是否可点击,如果不可点击,则使其可点击,并为按钮创建一个侦听器,这对吗

但我仍然不明白为什么它是这样写和结构的:

Button sendMail = (Button) findViewById(R.id.send_email); 
    sendMail.setOnClickListener(new View.OnClickListener() { 

        public void onClick(View view) { 
          Mail m = new Mail("email@gmail.com", "password");     

          m.setTo("email@gmail.com"); 
          m.setFrom("email@gmail.com"); 
          m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
          m.setBody("Email body."); 

          try { 
            m.addAttachment("/sdcard/filelocation"); 

            if(m.send()) { 

            Toast.makeText(m, "Email was sent successfully.", Toast.LENGTH_LONG).show();                    

            } else { 
              Toast.makeText(getApplicationContext(), "Email was not sent.", Toast.LENGTH_LONG).show(); 
            } 
          } catch(Exception e) { 
            Toast.makeText(getApplicationContext(), "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
            Log.e("MailApp", "Could not send email", e); 
          } 
        } 
      }); 
我认为应该是:

sendMail.setOnClickListener();
sendMail.onClick(this);

public void onClick(View view) {...}

单击此视图时要调用的任何注释或注册回调。如果此视图不可单击,它将变为可单击。

在setOnClickListener方法中创建侦听器的新实例时,它就是这样工作的。这一点也不奇怪

或者,您可以在按钮XML端为android:onClick设置一个方法。在代码中,您需要执行以下操作:

public void testMethod(View v) {
  // code
}

它被称为匿名类。与使用class关键字创建一个新类不同,您只需对所有必需的方法使用语法new{…}


上阅读有关匿名类的更多信息它被称为匿名内部类,这是一种常见的Java模式。您可以自由定义实现该方法的显式类,并将侦听器设置为该类。

这基本上是一个子类。这种方法称为匿名子类化。它允许您创建一个子类并一起使用


匿名子类没有构造函数,因为该类没有名称。为此,您需要使用实例初始化器。基本上,这些类是在创建另一个类文件时使用的,因为它感觉是多余的,如果您想将类代码放在同一块中,至少这就是我使用它的原因

指向教程的链接似乎丢失了。