我们通常按以下方式在按钮上(在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的两种方式将如何相互对立?
答案 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;
}