2

我们通常通过以下方式(方式 1 )在按钮(在 GWT 或 Swing 或 Android 中)上编写点击处理程序。

class A {

    public void myMethod() {

        int count = 0 ;

        Button myButton = new Button("x");
        myButton.addClickHandler(new ClickHandler() {
          public void onClick(ClickEvent event) {
              count = 1 ;
          }

        });

    }
}

但是,我们也可以为点击处理程序编写一个不同的类并像下面这样实现它(方式 2):

class A implements ButtonClickInterface {

    int count ;
    public void myMethod() {

        count = 0 ;

        Button myButton = new Button("x");
        myButton.addClickHandler(new MyClickHander(this));

    }

    @Override
    public void buttonClicked() {
        count = 1 ;        
    }
}

interface ButtonClickInterface {
    public void buttonClicked() ;
}

class MyClickHandler implements ClickHandler {


    ButtonClickInterface buttonClickInterface ;

    public MyClickHandler(ButtonClickInterface buttonClickInterface) {
        this.buttonClickInterface = buttonClickInterface ;
    }

    @Override
    public void onClick(ClickEvent event) {
        buttonClickInterface.buttonClicked() ;         
    }

}

在这里,我必须将count其作为类变量。这有什么缺点吗?上述实现方式还有其他缺点吗?我实现 ClickHandler 的两种方式在复杂性、耦合性、创建的对象数量和代码可读性方面如何相互对抗?

4

4 回答 4

5

您还可以在 xml 中定义 clickHandler。

把它放在你的 Activity 类中:

public void myClickEvent(View view) {
    //Do something
}

并将其放入您的布局 .xml 中:

<Button
        android:id="@+id/myId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button1"
        android:onClick="myClickEvent"/>
于 2012-06-07T10:53:07.150 回答
2

您的第二个解决方案太复杂了。

我经常在 Android 上这样做(伪代码):

class A implements OnClickListener {

    onCreate() {
        myButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.myButtonId:
                // do something
                break;
            // more cases
            default: 
                Log.w(LOG_TAG, "not implemented");
        }
    }
}
于 2012-06-07T10:36:24.400 回答
2

当点击处理程序仅用于一个地方的单个按钮时,我宁愿选择

Button myButton = new Button("x");
myButton.addClickHandler(new ClickHandler() {
          public void onClick(ClickEvent event) {
              count = 1 ;
          }

});

将单击处理程序放在单独的类中仅在处理程序可以被其他控件重用时才有用。至于你的问题,我通常会选择 options 1。选项2太复杂了,并且引入了另一种并不真正需要的间接方式。

于 2012-06-07T10:56:15.713 回答
2

使用 GWT 并使用 UiBinder,您还可以使用@UiHandler方法:

@UiField Button myButton; // will be injected by UiBinder

@UiHandler("myButton") // will be bound to my Button as ClickHandler by UiBinder
void incrementClick(ClickEvent event) {
  count += 1;
}
于 2012-06-07T12:24:57.063 回答