![](/img/trans.png)
[英]implements OnClickListener VS. new Button.OnClickListener() {};
[英]Declaring that a class implements OnClickListener vs. declaring it yourself?
为我的标题道歉,我无法正确地阐述问题。
我见过以两种方式实现的OnCLickListener
。 第一个是通过表示您的类实现OnCLickListener
。 第二个是通过让你自己声明它来完成任务。
为什么在第一个选项中你可以简单地将this
作为你的setOnCLickListener
参数,但在第二个选项中你必须自己解决创建OnClickListener
对象的麻烦?
首先:
public class WidgetConfig extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.widgetconfig);
Button b = (Button)findViewById(R.id.bwidgetconfig);
b.setOnClickListener(this);
}
//onClick defined outside of the onCreate
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
第二:
public class WidgetConfig extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.widgetconfig);
Button b = (Button)findViewById(R.id.bwidgetconfig);
b.setOnClickListener(bListener);
}
private Button bListener = new OnClickListener(){
b.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//TO-DO
}
});
在第一种方法中, 整个Activity类实现了OnClickListener
接口。 您可以将每个View的OnClickListener
设置为此 ,并在一个方法中接收所有单击事件,然后您可以在其中过滤它们并对其进行操作。
第二种方法使用实现接口方法的匿名内部类 。 通过使用此方法,您只能接收特定视图的事件。
在第一种方法中,您的整个类使用OnClickListener
一个实例,该实例将传递给您想要监听点击的所有视图。
第二种方法转换为:
Button.OnClickListener anonymous_listener = new Button.OnClickListener() { ... };
button.setOnClickListener(anonymous_listener);
也就是说,它在您使用它时动态创建并存储新的OnClickListener
实例。
我通常采取第一种方式,因为它保存了一个对象。 但是如果你需要实现许多监听器,那么为了使代码更有条理和整洁,你可以考虑第二种方式。
在案例1中, this
表示Activity
类型和OnClickListener
类型的对象。 因此,当您在b.setOnClickListener(this)中传递this
,它表示类型为“OnClickListener”的对象。
在案例2中,您传递的是OnClickListener
类型的anonymous object
。 因为, OnClickListener
是一个interface
您必须在匿名对象内定义onClick
方法。
如果onClickListener
需要访问Activity类的(大多数)方法和成员变量,那么可以使用第一种方法来简化代码。 此外,如果您想以相同的方式处理所有“ onClick
”,这可能是首选。
否则,当您有许多按钮(或需要点击处理的其他类型的视图)时,应该采用第二个选项,并且所有这些选项都需要以不同的方式处理。 在这种情况下,让Activity处理onClick
一个按钮(视图)是没有意义的,其余部分由单个onClickListener
处理,因为这会使代码看起来不一致。
您的WidgetConfig类“是一个”活动,因为它扩展了Activity。 但是,您的WidgetConfig类“(也)是一个OnClickListener
因为它实现了接口。 因此,当setOnClickListener()
请求你在点击听众传递作为参数,你可以在通过“ this
”,因为“ this
”(这是WidgetConfig)“是一个” onClickListener
。
使用匿名内部类,您可以获得设置和回调。 但是,你应该阅读这个关于使用这些类的潜在缺陷: 什么时候使用(匿名)内部类是否安全?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.