请解释这个结构以及它为什么这样使用?

时间:2011-10-08 14:00:22

标签: android email

我在[本教程] [1]中找到了下面的代码段。我不明白到底发生了什么。看起来按钮是创建的,然后设置一个监听器来监听它被点击的时间,但为什么整个onClick(View view)方法在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) {...}

任何注释或注册在单击此视图时要调用的回调。如果此视图无法点击,则会变为可点击。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

Wikibooks

了解有关匿名课程的更多信息

答案 2 :(得分:2)

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

答案 3 :(得分:0)

这就是在Listener方法中创建setOnClickListener()的新实例时的工作原理。根本没什么奇怪的。

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

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