我看到以下代码,用于从Android的文档中为Android中的按钮添加监听器:
public class MyActivity extends Activity {
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.content_layout_id);
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
}
}
好吧,因为setOnClickListener是一个接口,我们可以将代码修改为:
public class MyActivity extends Activity implements View.OnClickListener {
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.content_layout_id);
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(this);
public void onClick(View v) {
// Perform action on click
}
}
嗯,第二个代码对我来说看起来更合乎逻辑,因为我们给setOnClickListener()
方法参数this
,它表示监听器附加到的MyActivity
类的同一个实例
所以,我不明白第一个代码是如何工作的。根据我的理解new Interface
,我们创建了一个实现Interface
的匿名类。但是后来如何将侦听器附加到MyActivity
对象而不是匿名对象,因为我们将匿名实例作为参数提供给侦听器?
答案 0 :(得分:2)
但是后来如何将侦听器附加到MyActivity对象而不是 匿名的,因为我们将匿名实例作为参数提供给 听众?
监听器永远不会附加到活动中。两者之间没有真正的区别。在这两种情况下,您都提供了一个实现该接口的对象。 View将调用您通过setter提供的对象的onClick方法
答案 1 :(得分:0)
在这两种情况下,您都在提供OnClickListener接口的实现。只是以两种不同的方式(尽管他们确实有微妙的差异)。
我认为您对使用'this'关键字感到困惑,这可能会给人一种印象,即界面以某种方式附加到类(或本例中的活动)(如第二个示例中所示) 。
当类实现接口时,您可以使用'this'关键字来引用该接口的实现。由于setOnClickListener()方法正在寻找OnClickListener而不是Activity,因此编译器知道'this'指的是该类实现的接口的实现。
听起来听起来有点令人困惑......但希望它能为你清除它。
答案 2 :(得分:0)
当你调用button.setOnClickListener(new View.OnClickListener()...时,会创建一个新的匿名View.OnClickListener并作为回调附加到按钮。
实现View.OnClickListener时,您的类(Activity)成为接口方法的实现者。换句话说,您的类扮演View.OnClickListener。
的角色答案 3 :(得分:0)
第一种方式称为匿名内部类,第二种方式是ur活动类实现 onClickListener
接口,第三种方式可能是实现onClickListener接口的分离类,并且你将该类的实例传递给setOnClickListener(),但这可能更难,因为您可能需要与活动类中的对象进行交互,如上所述,一切都会起作用,它只是技术,你可以根据你的需要选择。