代号一-长按事件可忽略正常按

时间:2018-12-02 21:17:41

标签: events codenameone togglebutton floating-action-button

我一直在遵循本指南,并在演示的最后一直提供了工作示例(非常有见地的教程,建议10/10):

https://codenameone.teachable.com/courses/java-for-mobile-devices-introducing-codename-one/lectures/2647773

现在,我想通过添加一个浮动操作按钮来添加新项目,将其扩展到一个更实用的待办事项列表:

fab = FloatingActionButton.createFAB(FontImage.MATERIAL_ADD);
fab.bindFabToContainer(current.getContentPane(), Component.RIGHT,
Component.BOTTOM);
fab.addActionListener(e -> { // show dialog for adding new item });

这本身可以正常工作。现在是棘手的部分。在所有项目上使用长按事件时,应该发生两件事:

  1. 长按项目的外观应改变以指示它已被选中(不是用复选框或ToggleButton“选择”来表示,而是用高亮显示。)
  2. FAB应该更改其图标和操作侦听器,以删除突出显示的项目。

长按事件是通过从Checkbox类覆盖longPointPress方法实现的:

@Override
public void longPointerPress(int x, int y){
     mainForm.longPressEvent(this);
    // no event parameter for e.consume();
}

我的问题:

Q1:当我从ToggleButton使用动作侦听器时,会同时触发“正常”点击事件和长按事件。我需要区分两者。 longPointerPress方法在参数列表中没有该事件,因此在完成长时间的Press Event活动后,我无法使用该事件。如何防止正常动作侦听器触发?

Q2:对于“突出效果”,我希望该项目的所有面都具有边距,以使元素整体缩小该数量。换句话说,无需增加以前的总大小。通过仅增加边距,该项目会变大。 如何缩小给定元素的边距,但保留原始大小?

Q3:FAB仅可以选择“ setIcon”,而不能选择“ setMaterialIcon”。因此,我现在每次更改FAB时都在重新创建它,因为我不想忙于所涉及的样式。有没有比这更好的方法了?

//this is the unwanted function, as I dont want to set the style myself
fab.setIcon(FontImage.createMaterial(icon, s));

//Delete FAB pressed, change to Add FAB
fab.remove();
fab = FloatingActionButton.createFAB(FontImage.MATERIAL_ADD);
fab.bindFabToContainer(current.getContentPane(), Component.RIGHT, Component.BOTTOM);

1 个答案:

答案 0 :(得分:1)

总是在释放指针时调用Action事件,而不管是否触发了长按事件,因为我们不“知道”您处理了longPress事件。您需要创建一个标志,例如:

private boolean handledInLongPress;

public void longPress(int x, int y) {
   // do your stuff
   handledInLongPress = true;
}


private void handleActionEvent(ActionEvent ev) {
    // I'm using this as a placeholder for your event code
    // block the event from propagating and undo anything it might
    // have triggered
    ev.consume();
}

我建议在元素上使用setUIID()并定义一组“删除*”的UIID。您可以定义较小的填充和字体来创建缩小效果,但是如果在此处也有图标,这可能会很棘手。您可以按比例缩小上述图标,并将原始图标保留在客户端属性中。

FAB进行了大量假设,因此重新创建它(或使用两个实例)可能比尝试设置图标更好。在当前实现中,无法在运行时更改FAB的图标。