Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写一个优雅的点击处理程序_Java_Android_Gwt - Fatal编程技术网

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

Java 编写一个优雅的点击处理程序,java,android,gwt,Java,Android,Gwt,我们通常按照以下方式(方式1)在按钮(GWT、Swing或Android)上编写单击处理程序 但是,我们也可以为click处理程序编写一个不同的类,并按照以下方式实现它(way2): 在这里,我必须将计算为类变量。这有什么缺点吗?上述实施方式是否还有其他缺点?在复杂性、耦合性、创建的对象数量和代码可读性方面,我实现ClickHandler的两种方式如何相互对抗?您的第二种解决方案太复杂了 我经常在Android上这样做(伪代码): 您还可以用xml定义clickHandler 把这个放在你的活动

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

但是,我们也可以为click处理程序编写一个不同的类,并按照以下方式实现它(way2):


在这里,我必须将
计算为类变量。这有什么缺点吗?上述实施方式是否还有其他缺点?在复杂性、耦合性、创建的对象数量和代码可读性方面,我实现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;
}