我在[本教程] [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) {...}
任何注释或注册在单击此视图时要调用的回调。如果此视图无法点击,则会变为可点击。
答案 0 :(得分:3)
这基本上是一个子类。此方法称为匿名子类。它允许您创建子类并一起使用它。
匿名子类没有构造函数,因为类没有名称。为此,您需要使用实例初始化程序。基本上这些类在创建另一个类文件时使用,因为它感觉多余,如果你想将类代码保存在同一个块中(至少为什么我使用它)。
答案 1 :(得分:2)
它被称为匿名类。您只需使用语法class
和所有必需的方法,而不是使用new <superclass-or-interface-name>() { ... }
关键字创建新类。
答案 2 :(得分:2)
它被称为匿名内部类,它是一种常见的Java模式。您可以自由地定义一个实现该方法的显式类,并将侦听器设置为它。
答案 3 :(得分:0)
这就是在Listener
方法中创建setOnClickListener()
的新实例时的工作原理。根本没什么奇怪的。
或者,您可以在按钮XML侧为android:onClick
设置方法。在代码中,您需要执行以下操作:
public void testMethod(View v) {
// code
}