繁体   English   中英

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

[英]What is the difference between these two ways of using buttons and an 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 }

正是这样的事情使我的书感到恐惧,也是我不打算购买下一本书的原因之一。 我讨厌它只是在没有任何真正原因的情况下改变了做事的方式。 那么,有人能真正告诉我这里的区别吗? 谢谢。

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

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

就像每个人都说的一样,没有区别-但是没有人解释原因。

Button扩展了View

使用onClickListener ,将使用View定义的那个。 几乎总是这样,它会起作用-不会与Dialogs以及其他一些类一起使用。

如果您明确地说出Button.onClickListener ,则引用的是Button类中定义的onClickListener ,并且由于Button扩展了View ,因此这与使用常规onClickListener.相同onClickListener.

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

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

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

不同的人喜欢以不同的方式进行操作,因此他们倾向于使用不同的功能。

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

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

希望现在看起来更加清晰

您发布的两个示例之间没有真正的区别。 您的书可能没有涵盖这方面的内容,因为与Android相比,这更多的是Java问题。 第一个是动态声明您的OnClickListener实例,第二个是静态声明它,然后引用它。 在执行中,它们的行为将完全相同。

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

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

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

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

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

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

button.setOnClickListener(new OnClickListener() 

假设它已经动态创建了一个侦听器对象,并将其传递给您的setOnClickListener 此样式在Java中称为“匿名内部类”。 第二个很简单。

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

使用Button.OnClickListener的原因是OnClickListenerView类中 Button类从View继承它 因此,为了避免导入语句,我们直接使用Button.OnClickListener

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM