【问题标题】:Declaring that a class implements OnClickListener vs. declaring it yourself?声明一个类实现 OnClickListener 与自己声明它?
【发布时间】:2013-07-06 13:47:54
【问题描述】:

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

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

            }
});

【问题讨论】:

  • 这个问题与android无关,它与您的JAVA概念有关
  • 方式#3 - 仅供参考,您还可以创建自己的自定义类,让它实现 ClickListener 接口,然后创建该侦听器的新实例。然后调用:setOnClickListener(new YourCustomClass())。这是封装处理点击操作的代码的好方法。

标签: java android onclicklistener


【解决方案1】:

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

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

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

第二种方法翻译为:

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

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

【讨论】:

  • 如果整个类都实现了OnCLickListener,和第一种方法一样,我怎么会为多个按钮设置多个onClick方法呢?
  • 您必须在被覆盖的方法中使用 switch 语句,并使用 view id 来打开。只需查找 java 的 switch 语句,您就会看到。
  • 哪种方法更好,为什么??
  • 我认为您应该阅读此内容以更好地理解:programmers.stackexchange.com/questions/110106/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        使用匿名内部类,您可以将设置和回调合二为一。不过,您应该阅读这篇文章,了解使用此类类的潜在陷阱:When exactly is it leak safe to use (anonymous) inner classes?

        【讨论】:

          猜你喜欢
          • 2012-04-22
          • 1970-01-01
          • 2019-12-30
          • 2011-02-23
          • 1970-01-01
          • 2015-04-05
          • 2018-09-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多