Java 编写一个优雅的点击处理程序
我们通常按照以下方式(方式1)在按钮(GWT、Swing或Android)上编写单击处理程序 但是,我们也可以为click处理程序编写一个不同的类,并按照以下方式实现它(way2):Java 编写一个优雅的点击处理程序,java,android,gwt,Java,Android,Gwt,我们通常按照以下方式(方式1)在按钮(GWT、Swing或Android)上编写单击处理程序 但是,我们也可以为click处理程序编写一个不同的类,并按照以下方式实现它(way2): 在这里,我必须将计算为类变量。这有什么缺点吗?上述实施方式是否还有其他缺点?在复杂性、耦合性、创建的对象数量和代码可读性方面,我实现ClickHandler的两种方式如何相互对抗?您的第二种解决方案太复杂了 我经常在Android上这样做(伪代码): 您还可以用xml定义clickHandler 把这个放在你的活动
在这里,我必须将
计算为类变量。这有什么缺点吗?上述实施方式是否还有其他缺点?在复杂性、耦合性、创建的对象数量和代码可读性方面,我实现ClickHandler的两种方式如何相互对抗?您的第二种解决方案太复杂了
我经常在Android上这样做(伪代码):
您还可以用xml定义clickHandler
把这个放在你的活动课上:
public void myClickEvent(View view) {
//Do something
}
并将其放在layout.xml中:
<Button
android:id="@+id/myId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
android:onClick="myClickEvent"/>
当单击处理程序仅用于一个位置的单个按钮时,我宁愿选择
Button myButton = new Button("x");
myButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
count = 1 ;
}
});
只有当处理程序可以被其他控件重用时,在单独的类中使用click处理程序才有用。
至于你的问题,我通常选择选项1
。选项2
太复杂了,引入了另一个实际上并不需要的间接寻址。使用GWT和UiBinder,您还可以使用@UiHandler
方法:
很抱歉,您不能再使用switch语句执行此操作,android不再将R.id.xxx设置为final,因此您必须改用if…else if…else。仅在库项目中使用!(只是测试以确保…)啊,很酷,这是一个库项目,为我标记了这一点,所以很高兴知道。你不知道关于android:onClick
属性和事件声明在类中使用相同的名称吗?我知道,但我不喜欢在必要的情况下混合布局和代码。在onClick属性中给出方法名称是一种混淆。如果我的web app/Android应用程序中有许多按钮(比如一个页面上有6个按钮),会怎么样?我只是讨厌那种将代码放在对象实例化中的方式。。。最不可维护和不可重用的东西。@acemcloud正如我提到的,如果您想重用事件处理程序,请将其移动到一个单独的位置class@m0skit0是的,它是不可重用的,这就是为什么我说如果你想重用,那么就使用一个完整的处理程序类:)如果你有6个按钮,你就创建一个方法public void addHandler(Button btn){btn.addClickHandler(new ClickHandler(){…}
,然后用它调用每个按钮addHandler(yourButton)
您的第一个代码段将不能按原样工作:count
必须是final
才能被ClickHandler
访问,因此是只读的。您需要int[1]
或其他持有者(AtomicInteger
可以在Swing或Android中使用,而不是GWT)。这会改变代码片段的复杂性,因此您可能需要重新考虑您的问题。+1我也建议这样做。代码更少,优化更多。
public void myClickEvent(View view) {
//Do something
}
<Button
android:id="@+id/myId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
android:onClick="myClickEvent"/>
Button myButton = new Button("x");
myButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
count = 1 ;
}
});
@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;
}