写一个优雅的点击处理程序

时间:2012-06-07 10:15:47

标签: java android gwt

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

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 个答案:

答案 0 :(得分: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"/>

答案 1 :(得分: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");
        }
    }
}

答案 2 :(得分:2)

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

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

});

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

答案 3 :(得分: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;
}