我有一本非常糟糕的书,所以我不确定他们使用这两种形式的推理。
它的第一种方式就是这样
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 }
这样的事情,我的书很糟糕,也是我不会购买下一部分的原因之一。我讨厌它只是在没有任何真正原因的情况下改变它的工作方式。所以有人能真正告诉我这里的区别吗?感谢。
答案 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 。