Как включить виртуальную клавиатуру JavaFX в Android с помощью JavaFXPorts

Я включил виртуальную клавиатуру JavaFX в настольном приложении (путем передачи аргументов виртуальной машины). Но при переносе на приложение Android с использованием JavaFXPorts виртуальная клавиатура JavaFX не отображается в Android, что показывает родную клавиатуру Android. И я попытался передать аргументы jvm через строку комментариев (при запуске gdradlew android), но это не сработало. А также я попытался вызвать методы FXVK.init(textField); FXVK.attach(textField);, когда текстовое поле было сфокусировано. Но они не показывают виртуальную клавиатуру JavaFX, она показывает только родную клавиатуру Android.


person Ashok Kumar    schedule 05.10.2018    source источник
comment
Предоставьте минимально воспроизводимый пример, демонстрирующий проблему.   -  person kleopatra    schedule 05.10.2018


Ответы (1)


Используя JavaFXPorts на Android, если вы попытаетесь распечатать:

Platform.isSupported(ConditionalFeature.VIRTUAL_KEYBOARD)

Результат будет false.

И причину этого можно найти в следующем:

  • Platform вызывает Toolkit.getToolkit().isSupported(), который переходит к QuantumToolkit, который заканчивается вызов Application.GetApplication().hasVirtualKeyboard().

  • Приложение для Android: MonocleApplication и hasVirtualKeyboard возвращает false:

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

В то время как сенсорный ввод поддерживается и второе условие истинно, первое условие не выполняется, потому что /java/com/sun/glass/ui/monocle/MonocleApplication.java?at=default#lines-104" rel="nofollow noreferrer">возвращает true. device — это экземпляр InputDevice, который на Android реализован AndroidInputDevice.

И, наконец, мы добираемся до AndroidInputDevice::isFullKeyboard, который возвращает true и делает приведенное выше условие ложным.

И мы видим комментарий, поясняющий, как это можно изменить:

@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. Но, учитывая ограничения этой клавиатуры, я не уверен, почему вы захотите использовать ее вместо родной.

person José Pereda    schedule 05.10.2018
comment
Мое приложение работает в портретном режиме. Когда я нажимаю на текстовое поле, появляется всплывающее окно родной клавиатуры и закрывает половину экрана (затем клавиатура скрывает следующее поле ввода). Мне нужно преодолеть эту проблему. Или как я могу настроить родную клавиатуру Android. Скажите, пожалуйста, каковы ограничения виртуальной клавиатуры JavaFX. - person Ashok Kumar; 08.10.2018
comment
Эта проблема устранена с помощью Gluon Mobile. Но если вы хотите исправить это самостоятельно, посмотрите этот ответ или этот другой один. Насчет клавиатур, с родной сравнить не возможно. Ваши пользователи не ожидают другой клавиатуры. JavaFX не настраивается (язык, кнопки, ...) - person José Pereda; 08.10.2018