Компонент BorderLayout.SOUTH всегда отображается на Android при редактировании текстового поля в Codenameone - PullRequest
0 голосов
/ 11 сентября 2018

У меня проблема с Android, но не с IOS. У меня есть базовый экран, где у меня есть 10 TextFields внутри прокручиваемого контейнера Y_AXIS; Я поместил это в контейнер BorderLayout.CENTRE внизу. Затем у меня есть кнопка в том же базовом контейнере, но в BorderLayout.SOUTH.

Когда пользователь нажимает на любое TextField, ситуация для его редактирования, отображается клавиатура, и она размещает содержимое BorderLayout.SOUTH, т.е. кнопка над клавиатурой, скрывающая некоторые поля. Я хочу, чтобы кнопка была скрыта под клавиатурой в соответствии с IOS.

Поскольку я только что осознал, что это происходит, у меня теперь есть несколько экранов, на которых это не происходит, если у меня есть определенное сочетание контейнеров и полей, некоторые экраны, где он раздавливает мои текстовые поля, и некоторые, где это происходит. просто скрывает еще одно поле внизу, которое я хочу видеть пользователю.

Я приложил основную страницу, показывающую это. Обратите внимание, что это нормально на симуляторе, если клавиатура не отображается. Большое спасибо

   public class Keyboard {
    private Form currentForm = new Form("", new BorderLayout());
    public void buildPage() {
        Container c = new Container(new BorderLayout());
        Container y = new Container(new BoxLayout(BoxLayout.Y_AXIS));
        y.setScrollableY(true);

        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());
        y.add(new TextField());

        c.add(BorderLayout.CENTER, y);
        c.add(BorderLayout.SOUTH, buildButton());

        currentForm.add(BorderLayout.CENTER, c);
        currentForm.getAllStyles().setBgColor(0x65363);
        currentForm.getAllStyles().setBgTransparency(255);
        currentForm.setFormBottomPaddingEditingMode(true);
        currentForm.show();
    }
    private Component buildButton() {
        Button button = new Button("Hide this button");
        return button;
    }
}

1 Ответ

0 голосов
/ 11 сентября 2018

Когда вы устанавливаете интерфейс в макет границы, вы неявно отключаете прокрутку. Это хорошо, так как вы можете иметь только один прокручиваемый элемент в иерархии на ось.

В iOS при открытии клавиатуры область прокрутки увеличивается. Поскольку кнопка исключена из области прокрутки, она всегда видна. Опять же, это по замыслу, например он может держать кнопку «ОК» в поле зрения, что может быть желательным поведением.

Если вы не хотите такого поведения, вам нужно использовать прокручиваемый контейнер. К сожалению, в тот момент, когда пользовательский интерфейс прокручивается, сложно реализовать такие функции, как размещение кнопки в нижней части экрана.

Наша система с трудом обнаруживает нижнюю часть экрана, когда пользовательский интерфейс прокручивается, поскольку размеры иерархии могут изменяться динамически, а нижняя часть может находиться где угодно. Это может быть выполнимо с многоуровневой компоновкой нового построителя GUI.

...