如何检测 OS 中 ContextMenu 的出现?

How to detect occurence of ContextMenu in OS?

我正在使用 Gluon 将 javafx 应用程序开发到 Android、Iphone(以及桌面)。当我将测试应用程序导出到我的 Android phone (Marshmallow 6.0) - 我无法按住文本访问可以复制文本的菜单(上下文菜单) (这是您可以使用上下文菜单执行的操作的示例 - 而不是在 Android 中如何复制长按文本的问题).

在 iphone 6 上进行测试时,这是可能的。

如何检测 device/operating 系统在 java 中是否有默认上下文菜单?

在桌面上有一个默认的 ContextMenu 创建并安装在 TextFieldBehavior 中(私有 API)。如果您不设置自己的自定义上下文菜单,那将是触发 ContextMenuEvent 时使用的菜单(例如右键单击事件)。

在移动设备上,Android 和 iOS 都有 ContextMenu

在 iOS 上,它使用原生 TextField (UITextField)。当长按事件发生时,它会触发默认的上下文菜单(在我的 iPad 上我可以看到一个小放大镜,然后显示上下文菜单)。

在 Android 上,JavaFX TextField 具有自定义外观,但与桌面版本共享相同的私有 TextFieldBehavior。本例中的问题是缺少会触发 ContextMenuEvent 事件的右键单击事件。

这就是为什么您必须手动触发 ContextMenuEvent 事件,如 中所述。

结论:到目前为止,这基本上只需要Android:

TextField textField = new TextField();

addPressAndHoldHandler(textField, Duration.seconds(1), event -> {
        Bounds bounds = textField.localToScreen(textField.getBoundsInLocal());
        textField.fireEvent(new ContextMenuEvent(ContextMenuEvent.CONTEXT_MENU_REQUESTED, 
                0, 0, bounds.getMinX() + 10, bounds.getMaxY() + 10, false, null));
    });