如何使用 JavaFXPorts 在 android 中启用 JavaFX 虚拟键盘

Posted

技术标签:

【中文标题】如何使用 JavaFXPorts 在 android 中启用 JavaFX 虚拟键盘【英文标题】:How to enable JavaFX virtual keyboard in android using JavaFXPorts 【发布时间】:2018-10-05 06:25:23 【问题描述】:

我已在桌面应用程序上启用 JavaFX 虚拟键盘(通过传递虚拟机参数)。但是,当使用 JavaFXPorts 移植到 android 应用程序时,JavaFX 虚拟键盘在 android 中不可见,这显示了 android 的本机键盘。我试图通过注释行传递 jvm 参数(在运行 gdradlew android 时),但它不起作用。我还尝试在文本字段集中时调用 FXVK.init(textField); FXVK.attach(textField); 方法。但是这些都没有显示 JavaFX 虚拟键盘,它只显示 android 本机键盘。

【问题讨论】:

请提供一个minimal reproducible example 来说明问题。 【参考方案1】:

在 Android 上使用 JavaFXPorts,如果您尝试打印:

Platform.isSupported(ConditionalFeature.VIRTUAL_KEYBOARD)

结果将是false

原因如下:

Platform 调用Toolkit.getToolkit().isSupported(),然后转到QuantumToolkit,最后是calling Application.GetApplication().hasVirtualKeyboard()

Android的应用是MonocleApplication,hasVirtualKeyboard返回false:

@Override
public boolean hasVirtualKeyboard() 
    return deviceFlags[DEVICE_PC_KEYBOARD] == 0 && 
           deviceFlags[DEVICE_TOUCH] > 0;

虽然支持触摸并且第二个条件为真,但第一个条件失败,因为device.isFullKeyboard()returns 为真。 deviceInputDevice 的一个实例,在Android 上由AndroidInputDevice 实现。

我们终于到达AndroidInputDevice::isFullKeyboard,它返回真并使上述条件为假。

我们可以看到 comment 解释了如何更改:

@Override
public boolean isFullKeyboard() 
    // if we return false, the JavaFX virtual keyboard will be used 
    // instead of the android built-in one
    return true;

如果您修改该行并构建 JavaFXPorts,您将获得对 JavaFX 键盘的支持。但鉴于该键盘的局限性,我不确定您为什么要使用它而不是原生键盘。

【讨论】:

我的应用程序在纵向模式下运行。当我单击文本字段时,会弹出本机键盘并覆盖屏幕的一半(然后键盘隐藏下一个输入字段)。我需要克服这个问题。或者我如何自定义 android 本机键盘。请告诉我 JavaFX 虚拟键盘的限制是什么。 Gluon Mobile 解决了这个问题。但是,如果您想自己修复它,请查看此answer 或其他one。关于键盘,无法与原生键盘进行比较。您的用户不会期待不同的键盘。 JavaFX 不可自定义(语言、按钮等)

以上是关于如何使用 JavaFXPorts 在 android 中启用 JavaFX 虚拟键盘的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 与 JavaFXPorts 的兼容性

JavaFXPorts MySqlDB-Driver 包含在项目中:dex 错误

Gradle 找不到 Android 支持存储库 - Eclipse Neon、Gradle 3.5、javafxports

如何添加 Eclipse Gradle 任务选项卡?

如何更改生成的 apk 文件的默认输出文件夹?

MyEclipse中android 项目如何解决第三方jar无法关联源码的问题( The JAR of this class file belongs to container 'Androi