2013-07-09 82 views
4

我的标题道歉,我无法正确阐述问题。我看过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 

      } 
}); 
+0

这个问题是无处相关的android,它涉及到你的JAVA概念 –

+0

方式#3 - 只是FYI,你也可以创建自己的自定义类,让它实现ClickListener接口,然后创建该侦听器的新实例。然后您可以调用:setOnClickListener(new YourCustomClass())。这是封装处理您的点击操作的代码的好方法。 –

回答

4

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

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

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

第二种方法转化为:

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

这就是说,它动态地创建,当你使用它存储新OnClickListener实例。

+0

如果整个类实现OnCLickListener,就像在第一个方法中那样,我怎么会为多个按钮设置多个onClick方法? – Richard

+0

您将不得不在重写的方法内使用** switch **语句,并使用**视图ID **开启。只要查看**切换语句**为Java,你会看到。 –

+0

明白了,谢谢 – Richard

1

我通常做的第一方式,因为它节省的对象。但是如果你需要实现许多监听器,那么为了让代码更加有组织和整洁,你可以考虑第二种方式。

1

案例1this代表ActivityOnClickListener类型的对象。所以,当你在b.setOnClickListener(this)中传递this时,它代表'OnClickListener'类型的对象。

案例2您通过anonymous object类型OnClickListener。因为,OnClickListenerinterface您必须在匿名对象内定义方法onClick

1

如果您的onClickListener需要访问(大部分)方法和成员变量的类,那么可以采用第一种方法来简化代码。另外,如果您想要以相同的方式处理所有“onClick”,则可能会首选。

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

1

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

使用匿名内部类,您可以将设置和回调功能集于一身。你应该阅读这个,但是,关于使用这样的类的潜在隐患:When exactly is it leak safe to use (anonymous) inner classes?