2

通常、(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 を実装した 2 つの方法は、複雑さ、結合、作成されたオブジェクトの数、コードの読みやすさの点でどのように対立するのでしょうか?

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

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 に答える
2

クリック ハンドラーが 1 つの場所の 1 つのボタンにのみ使用される場合は、代わりに

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

});

別のクラスにクリック ハンドラーを配置することは、ハンドラーを他のコントロールで再利用できる場合にのみ IMO に役立ちます。あなたの質問に関しては、私は通常 options を選びます1。オプション2は複雑すぎて、実際には必要のない別の間接化を導入します。

于 2012-06-07T10:56:15.713 に答える
2

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 に答える