[英]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的原因是OnClickListener在View类中 。 Button类从View继承它 。 因此,为了避免导入语句,我们直接使用Button.OnClickListener 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.