我已经构建了一个GWT(2.5)Web应用程序,其中包括使用DataGrid。我使用addDomHandler添加一个DoubleClickEvent来选择一行并执行一个动作,它在桌面上运行良好。但是,当我在触摸设备上运行Web应用程序时,双击会缩放屏幕。有没有正确的方法来处理?我宁愿覆盖缩放的默认行为,但我不知道从哪里开始。我认为长按可能更合适,但我不知道从哪里开始。
代码:
_dataGrid.addDomHandler(new DoubleClickHandler() {
@Override
public void onDoubleClick(DoubleClickEvent event) {
// Do something exciting here!
}
}, DoubleClickEvent.getType());
答案 0 :(得分:0)
我唯一能够阻止DOM事件传播的想法可能会阻止默认的缩放行为。
虽然我很好奇,但它会在触摸屏设备上注册为双击事件 。值得尝试将处理程序放在Root上,看看你是否能捕获事件。
还试试这个:只需让你的应用程序捕获-any-DOM事件,然后以某种方式写出名称。这样你就应该找出触发的事件(可能是长时间的触摸!)并且可以为此编写处理程序。
答案 1 :(得分:0)
好的,我找到了解决方案,但这可能与我的情况非常不同。我做的是保持双击处理程序,我也实现了一个慢速双击。换句话说,如果您按顺序两次选择DataGrid的同一行,无论您执行多快,应用程序都会将其解释为双击。这是代码:
result.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Scheduler.get().scheduleDeferred(new Command() {
public void execute () {
if (result.isDoubleTap()) {
// Do the same thing a a double click.
}
}
});
}});
我在选择更改处理程序之前触发了单击处理程序的问题,所以我不得不推迟使用Scheduler处理click事件。 “结果”是包含DataGrid和其他一些东西的Composite,在每个“结果”中,我将最后选择的项存储在私有变量中。然后在IsDoubleTap()中,我所做的就是查看当前选择是否与最后一个相同:
public boolean isDoubleTap() {
boolean result = false;
String selected = getSelected();
if (_lastSelect != null && selected != null && selected.equals(_lastSelect))
result = true;
_lastSelect = selected;
return result;
}
如果您进行正常的双击或慢速双击,您将获得相同的操作。我很高兴虽然我使用这个结果对象很多地方,但它是我使用双击的唯一地方。我真的希望与委员会进行转换,决定用触摸设备覆盖标准的双击行为是一件好事。