这两种使用按钮和OnClickListener的方法有什么区别?

时间:2012-06-26 16:20:21

标签: java android onclicklistener

我有一本非常糟糕的书,所以我不确定他们使用这两种形式的推理。

它的第一种方式就是这样

 Button button = (Button) findViewById(R.id.btnButton)

 button.setOnClickListener(new OnClickListener() {
//code code code }

然后我们的书想要使用全局变量而不是本地变量,所以它随机开始使用不同的方式去做事情

Button btButton;
//Done as Global Variable.

btButton = (Button) findViewById(R.id.btnButton);
btButton.setOnClickListener(bButton);


Button.OnClickListener bButton = new Button.OnClickListener(){
//code }

这样的事情,我的书很糟糕,也是我不会购买下一部分的原因之一。我讨厌它只是在没有任何真正原因的情况下改变它的工作方式。所以有人能真正告诉我这里的区别吗?感谢。

6 个答案:

答案 0 :(得分:4)

两者都相同.. 第一个使用匿名内部类,secon on创建一个listner对象并将其传递给方法..

第二种方法具有相同列表器实例的可重用性的优点..但首先是首选,因为通常我们为每个按钮都有不同的列表器

答案 1 :(得分:3)

正如大家所说,没有区别 - 但没有人解释原因。

Button延伸View

当您使用onClickListener时,您正在使用View中定义的那个。几乎总是,这一个将起作用 - 它不会与Dialogs,也可能是其他一些类。

如果您明确说出Button.onClickListener,则引用onClickListener类中定义的Button,并且Button延伸View,这是相同的使用通用onClickListener.

还有内部匿名vs显性,但这更像是一种偏好。使用静态onClickListener比使用内部匿名更好,只是因为需要更少的垃圾收集,但除非你有30个左右的匿名内部监听器,否则你不会注意到它。

答案 2 :(得分:2)

你无需担心。他们都做同样的事情。在第一个示例中,当您将OnClickListener设置为按钮时,它将创建该实例。

在第二种情况下,onClickListener已经预先创建,并且您正在传入对它的引用。

不同的人喜欢以不同的方式做,并且他们适应不同的功能。

显然,在第二个示例中将其设置为等于bButton允许您稍后操作它或在其他按钮侦听器中使用它,而您没有第一个用于执行该操作的副本。

因此,如果您想对几个按钮使用完全相同的代码,第二个选项将允许您将侦听器添加到所有按钮。

希望现在看起来更清晰

答案 3 :(得分:2)

您发布的两个示例之间没有真正的区别。你的书可能没有涵盖这个,因为这更像是一个Java问题,而不是Android。第一个你只是动态声明你的OnClickListener实例,在第二个你在stataically声明它然后引用它。在执行中,它们的行为完全相同。

如果您有多个按钮,则可以使用第二个示例。您可以将OnClickListener传递给每个按钮,然后在OnClickListener中处理按下哪个按钮,而不是为每个按钮分别使用OnClickListener。

答案 4 :(得分:2)

从技术上讲,当你写:

button.setOnClickListener(new OnClickListener() { ... });

它将在编译时转换为以下代码:

Button.OnClickListener anonymous_listener = new Button.OnClickListener() { ... };
button.setOnClickListener(anonymous_listener);

你提供的第二个例子很糟糕。它存储了对OnClickListener的无用引用,该引用永远不会在onCreate()方法中的其他地方使用。它只丢失了8个字节,但它仍然没用,应该定义为局部变量。

答案 5 :(得分:2)

button.setOnClickListener(new OnClickListener() 

假设它已动态创建了一个侦听器对象并将其传递给 setOnClickListener 。这种风格在java中称为匿名内部类。第二个是直截了当的。

Button.OnClickListener bButton = new Button.OnClickListener(){

使用 Button.OnClickListener 的原因是 OnClickListener 位于 View Class 中。和 Button Class从View 继承它。所以为了避免import语句,我们直接使用 Button.OnClickListener