2011-10-08 70 views
0

我在[本教程] [1]中找到了下面的代码段。我不明白究竟发生了什么。似乎按钮已创建,并且侦听器被设置为侦听点击时的状态,但为什么sendMail.setOnClickListener()的(...)中的整个onClick(View view)方法?请解释一下这个结构,以及它为什么会这样使用?

关于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 protected]", "password");  

      m.setTo("[email protected]"); 
      m.setFrom("[email protected]"); 
      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) {...} 

任何意见或注册一个回调被调用当这个观点被点击时。如果此视图不可点击,则可点击。

+0

该教程的链接似乎丢失。 –

回答

3

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

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

+0

+1对于一个很好的解释哥们。 –

0

这就是它在setOnClickListener()方法内创建Listener的新实例时的工作方式。没有什么奇怪的。

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

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

它被称为匿名类。除了使用class关键字创建新类外,您只需使用语法new <superclass-or-interface-name>() { ... }以及所有必需的方法。

了解更多关于匿名类在Wikibooks

2

这就是所谓的匿名内部类,它是一种常见的Java模式。您可以自由定义一个实现该方法的显式类,并将其设置为侦听器。

相关问题