繁体   English   中英

声明一个类实现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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM