1

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

第一种方式是这样的

 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 }

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

4

6 回答 6

4

两者都是一样的..第一个使用匿名内部类,第二个创建listner对象并将其传递给方法..

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

于 2012-06-26T16:25:42.840 回答
3

正如每个人所说,没有区别——但没有人解释原因。

Button延伸View

当您使用onClickListener时,您使用的是 中定义的那个View。几乎总是,这个会起作用——它不会与Dialogs,也许还有其他一些类一起使用。

如果您明确地说Button.onClickListener,您正在引用类onClickListener中的定义Button,并且由于Buttonextends View,这与使用泛型相同onClickListener.

还有内部匿名与显式,但这更多是一种偏好。使用静态 onClickListener 将获得比内部匿名更好的性能,这仅仅是因为需要的垃圾收集更少,但除非您有 30 个左右的匿名内部侦听器,否则您不会注意到它。

于 2012-06-26T16:29:12.947 回答
2

你没有什么可担心的。他们都做同样的事情。在第一个示例中,当您将其设置为按钮时,您将创建 OnClickListener 的实例。

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

不同的人喜欢以不同的方式来做这件事,他们让自己拥有不同的功能。

显然,通过在第二个示例中将其设置为等于 bButton,您可以稍后对其进行操作或在其他按钮侦听器中使用它,而您没有第一个示例的副本来执行此操作。

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

希望现在看起来更清楚一点

于 2012-06-26T16:24:15.773 回答
2

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

例如,如果您有多个按钮,则可以使用第二个示例。您可以将 OnClickListener 传递给每个按钮,然后处理从 OnClickListener 中按下的按钮,而不是为每个按钮设置单独的 OnClickListener。

于 2012-06-26T16:25:15.440 回答
2

从技术上讲,当您编写时:

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

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

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

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

于 2012-06-26T16:33:41.010 回答
2
button.setOnClickListener(new OnClickListener() 

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

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

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

于 2012-06-26T16:35:02.143 回答