4

为我的标题道歉,我无法正确表达这个问题。

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

            }
});
4

5 回答 5

4

在第一种方法中,您整个 Activity 类都实现了该OnClickListener接口。您可以将OnClickListener每个 View 的 设置为this,并以一种方法接收所有点击事件,然后您可以在其中过滤它们并对其采取行动。

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

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

第二种方法转化为:

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

也就是说它会OnClickListener在你使用它时动态地创建和存储一个新的实例。

于 2013-07-09T04:44:14.583 回答
1

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

于 2013-07-09T04:39:32.283 回答
1

案例 1 this中,表示类型为Activity和的对象OnClickListener。因此,当您传入thisb.setOnClickListener(this) 时,它表示“OnClickListener”类型的对象。

案例 2中,您传递的anonymous object是 type OnClickListener。因为,OnClickListenerinterface必须onClick在匿名对象中定义方法。

于 2013-07-09T04:41:37.350 回答
1

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

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

于 2013-07-09T04:50:35.983 回答
1

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

使用匿名内部类,您可以将设置和回调合二为一。不过,您应该阅读这篇文章,了解使用此类类的潜在陷阱:使用(匿名)内部类究竟什么时候可以安全泄漏?

于 2013-07-09T05:24:27.500 回答