Клавиатура Android покрывает текстовое поле Qml

#android #qt #qml #qtquickcontrols2

Вопрос:

У меня есть Dialog элемент, содержащий верхний, нижний колонтитулы и содержимое, которое является ListView :

 Dialog {
    width: 200
    height: 200

    x: 10
    y: 100

    header: Rectangle {
        
    }

    contentItem: ListView {
        delegate: TextField {
            // this is covered by the Android keyboard
        }
    }

    footer: Rectangle {

    }
}
 

В iOS весь экран смещен вверх, так что вид списка TextField (https://doc.qt.io/qt-5/qml-qtquick-controls2-textfield.html) владение текстовым курсором всегда видно. На Android TextField курсор находится под клавиатурой Android. Я уже пытался установить android:windowSoftInputMode="adjustResize" , AndroidManifest.xml но безуспешно.

Есть ли простой способ убедиться, что TextField курсор, которым в данный момент владеет курсор, всегда виден? Или единственным решением является ручное перемещение координаты y диалогового окна?

Qml со скрытой клавиатурой: Qml со скрытой клавиатурой

Скрытие курсора с клавиатуры Qml: Скрытие курсора с клавиатуры Qml

Обычное текстовое поле Android: Обычное текстовое поле Android

Обычное текстовое поле Android сдвигается вверх, когда клавиатура открыта: Обычное текстовое поле Android сдвигается вверх, когда клавиатура открыта

С уважением,

Ответ №1:

Весь текстовый вид? Нет, клавиатуры в Android работают не так. Единственный рычаг, который у вас есть, — это режим softinput, который либо перемещает, либо изменяет размер. В режиме панорамирования экран прокручивается вверх таким образом, чтобы курсор всегда был виден (но остальная часть текста может отсутствовать). В режиме изменения размера приложение изменяется в пространстве над клавиатурой, а затем, при необходимости, смещается, чтобы курсор был виден. Иногда это может сделать большую часть экрана видимой, если у вас на экране было пустое пространство и ваш макет настроен на хорошее масштабирование (экраны входа в систему часто выигрывают). Но нет никакого способа гарантировать, что весь текст или любое другое поле по-прежнему отображается на экране. Это просто не так, как работает Android.

Комментарии:

1. Достаточно, чтобы курсор был виден (т. е. не закрывался клавиатурой). Но я не могу заставить это работать с Qml TextField .

2. Что же ты тогда видишь? Экран вообще не движется? Это было бы похоже на режим «adjustNone», который действительно существует, хотя его использование очень редко. Его стоит проверить, чтобы убедиться во время выполнения, что softInputMode является тем, чем он должен быть. Но ты ничего не можешь сделать, кроме этого. Нет даже способа узнать, когда клавиатура запускается и надежно отключается.

3. Я добавил несколько скриншотов, показывающих: Qml с закрытой клавиатурой, Qml с клавиатурой, покрывающей текстовое поле, по сравнению с обычным управлением Android, которое правильно перемещает поле, чтобы оно оставалось видимым.