setOnclickListner(this)是如何工作的?

3

当单击按钮时,有多种方法可以注册回调函数。如果我按照以下方式进行:

public class MainActivity extends Activity implements OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    Toast.makeText(this, "Hello onCLick", Toast.LENGTH_SHORT).show();
}
}

我不理解方法setOnClickListener(this)如何确定它应该调用onClick()方法?

可能是What does "this" mean?的重复问题。 - M D
1
请查看 https://dev59.com/T3XYa4cB1Zd3GeqP2RzJ#17964932 - Aman Gautam
2
我不明白。为什么要踩一下? 它们是不同的答案,可能理解它们会得出相同的结论。 我的问题是 - “如何通过方法setOnClickListener(this)识别它应该调用onClick()方法?” 请仔细阅读! - vanguard69
2
@Mooooooo 请帮我一个忙,去这个网站上给所有问题投反对票。 - vanguard69
@Mooooooo,我以为你踩了我的问题,现在我觉得是我误会了!和平! :) - vanguard69
5个回答

2
这指的是活动。因为Activity实现了OnClickListener,调用button.setOnClickListener(this)会将Activity实现的onClickListener设置为setOnClickListener。
如果想要了解更多有关Java接口实现的信息,我建议您查阅相关资料。

1
我想我理解你的困惑了。当你阅读其他SO答案或类似View.OnClickListener的参考资料时,感觉所有句子都在说同一件事情,但没有真正帮助到点击
发生的事情是,当一个Button被点击时,它会通知所有正在监听它的对象。你可以将你的活动作为监听器订阅到这个事件中,使用以下代码:
button.setOnClickListener(this);

因此,在单击事件发生时,按钮知道它应该调用活动的onClick事件。

我不明白方法setOnClickListener(this)如何确定它应该调用onClick()方法?

(因此,如果有混淆,是按钮调用listener.onClick()方法。)

@nourikhalass也有一点,你应该先确保接口对你有意义。

清楚了吗?


1

如果您了解面向对象编程,'this'指的是类的当前对象的引用。一个很好的解释可以在这里找到。

在上述情况中,MainActivity的引用在这里被称为'this'。

public void setOnClickListener(OnClickListener l)

是定义在Button类中的setter方法,它保存了"OnClickListener"的引用。

当您设置setOnClickListener(this)时,它定义了您正在将OnClickListener引用作为您的活动,因此要使您的活动成为OnClickListener类型,您必须在您的活动类中实现OnClickListener接口,就像代码中所示。

public class MainActivity extends Activity implements OnClickListener

这是一个回调监听器,其中有一个名为“onClick”的方法,您需要重写该方法,当按钮被点击时,Button类将调用该方法,因此事件监听器(在当前情况下是您的活动)可以听取它。


兄弟,感谢你提供链接,但是你的英语水平让人摇头。 - vanguard69
1
谢谢您的建议。您指出我的错误非常慷慨。我会尽力改进它。 - VikasGoyal

0

你的代码有

MainActivity implements OnClickListener

但实际上它是:

MainActivity implements View.OnClickListener

也许这就是让你感到困惑的原因。


0

"This" 指当前对象。

要处理按钮点击,对象必须实现 "OnClickListener" 接口并定义在 "onClick" 方法中接收点击时要执行的操作。然后,您可以将该对象注册为按钮点击的侦听器。

在您的情况下,您的活动实现了 OnClickListener,并且 onClick 显示一个 toast:

public class MainActivity extends Activity implements OnClickListener {
    ...

    @Override
    public void onClick(View v) {
        Toast.makeText(this, "Hello onCLick", Toast.LENGTH_SHORT).show();
    }

因此,您的活动可以处理按钮点击事件,因此您将其注册为按钮的侦听器:
button.setOnClickListener(this);

由于“this”实现了所需的接口,因此是一个有效的监听器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接