声明一个类实现OnClickListener而不是自己声明它?

时间:2013-07-09 04:37:36

标签: java android onclicklistener

为我的头衔道歉,我无法正确解决问题。

我看到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 

            }
});

5 个答案:

答案 0 :(得分:4)

在第一种方法中,整个Activity类实现OnClickListener接口。您可以将每个视图的OnClickListener设置为,并在一种方法中接收所有点击事件,然后您可以在其中对其进行过滤并对其进行操作。

第二种方法使用匿名内部类来实现接口方法。通过使用此方法,您只能接收特定视图的事件。

在第一种方法中,您的整个班级使用OnClickListener的一个实例,该实例会传递给您想要收听点击的所有视图。

第二种方法转换为:

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

也就是说,当您使用它时,它会动态创建并存储新的OnClickListener实例。

答案 1 :(得分:1)

我通常采用第一种方式,因为它保存了一个对象。但是如果你需要实现许多监听器,那么为了保持代码更有条理和整洁,你可以考虑第二种方式。

答案 2 :(得分:1)

案例1 this代表ActivityOnClickListener类型的对象。因此,当您在b.setOnClickListener(this)中传递this时,它表示类型为“OnClickListener”的对象。

案例2 中,您传递anonymous object类型OnClickListener。由于OnClickListenerinterface,因此您必须在匿名对象中定义方法onClick

答案 3 :(得分:1)

如果您的onClickListener需要访问 Activity 类的(大多数)方法和成员变量,那么可以使用第一种方法来简化代码。此外,如果您想以相同的方式处理所有“onClick”,则可能更受欢迎。

否则,当您有许多按钮(或需要点击处理的其他类型的视图)时,应该采取第二个选项,并且所有这些选项都需要以不同的方式处理。在这种情况下,将活动处理onClick用于一个按钮(视图)是没有意义的,其余部分由个别onClickListener处理代码看起来不一致。

答案 4 :(得分:1)

您的 WidgetConfig 类“是一个”活动,因为它扩展了Activity。但是,您的 WidgetConfig 类“(也)是”OnClickListener,因为它实现了接口。因此,当setOnClickListener()要求您作为参数传入单击侦听器时,您可以传入“this”,因为“this”(即WidgetConfig)“是一个” onClickListener

使用匿名内部类,您可以获得设置和回调。但是,您应该阅读这个关于使用这些类的潜在缺陷:When exactly is it leak safe to use (anonymous) inner classes?