Программный прослушиватель клавиатуры BlackBerry на OS 4.5 (или более поздней версии) совместимый код

#blackberry #java-me #soft-keyboard

#ежевика #java-me #программная клавиатура

Вопрос:

Я разрабатываю приложение, которое должно работать на устройствах с OS 4.5 или более поздней версией. В моем приложении мне нужно знать, когда виртуальная клавиатура видна или невидима. Поскольку, если виртуальная клавиатура видна, текстовая область, в которой пользователь должен вводить текст, находится за клавиатурой. Если бы я мог определить момент изменения состояния виртуальных клавиатур, я мог бы обновить экран и переместить текстовую область в верхнее положение.

Есть ли способ сделать это?

Редактировать: кнопка «Далее» находится на панели состояния. Поле редактирования находится в менеджере пользовательских горизонтальных полей.

введите описание изображения здесь

Когда я касаюсь поля редактирования, открывается виртуальная клавиатура, а содержимое поля редактирования теряется.

введите описание изображения здесь

Ответ №1:

Нет способа сделать это с тем же кодом. Вам нужно разделить свой код на две части. Один из них обрабатывает 4.5 — 4.7. Другой обрабатывает 4.7 и более поздние версии.

Вы можете добавить прослушиватель клавиатуры в код 4.7 (и более поздней версии), который должен проверять, изменяется ли экран в непрерывном потоке. Это не очень хорошо, но может сработать.

Ответ №2:

У вас есть два варианта. Первый вариант лучше:

  • Определите инвариант, который работает с видимой или скрытой клавиатурой. Метод разметки экрана вызывается при изменении состояния видимости клавиатуры и уменьшении размера по вертикали для видимой клавиатуры. Если ваши инварианты используют это преимущество, вы можете просто реализовать логику в методе компоновки экрана.
    В этом случае я бы предложил метод компоновки, при котором кнопка «далее» всегда остается внизу экрана, а текстовое поле имени пользователя помещается в центр оставшегося пространства.

  • Используйте условную компиляцию, чтобы вы могли написать код, ссылающийся на класс VirtualKeyboard в OS 4.7 , и этот код исчезнет в старых версиях BlackBerry. 4 июля: под условной компиляцией я подразумеваю использование препроцессора BlackBerry.

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

1. Кнопка «Далее» находится на другой панели, чем поле редактирования. Я не могу переместить его туда, поскольку вся логика реализации рухнет. Вы имеете в виду Class.forName(…) для условной компиляции?

Ответ №3:

Для этого нет события, но вы можете определить текущее состояние виртуальной клавиатуры и установить требуемое состояние. Например, скрыть это

     if(VirtualKeyboard.isSupported() == true){
        VirtualKeyboard keyboard = getVirtualKeyboard();

        if(keyboard != null)
            keyboard.setVisibility(VirtualKeyboard.HIDE);
    }
  

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

1. как я уже говорил ранее, я должен реализовать этот код с SDK 4.5 и выше. VirtualKeyboard класс доступен после версии 4.7SDK. так что это не ответ.

2. В таких терминах это просто невозможно.

3. @Ahmet Gulden, используй директиву preprocesseur для кода 4.7 docs.blackberry.com/en/developers/deliverables/12002 /…

4. @Micheal B. директивы препроцессора звучат хорошо. Я попробую это сделать. Но у меня все равно должен быть какой-нибудь слушатель для прослушивания событий клавиатуры.

Ответ №4:

Это довольно сложная работа. Однако я считаю, что не существует прямого API или способа определения состояния виртуальной клавиатуры. Единственный способ — переопределить setLayout() метод и определить, были ли изменены ширина и высота экрана. А также вам нужно проверить графические макеты вашего экрана.

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

1. ну, проблема в том, что я не мог знать, когда изменится ширина и высота экрана.

2. вы можете узнать, переопределив метод setLayout. Он всегда вызывает метод для любых изменений измерения

Ответ №5:

Установите VERTICAL_SCROLL стиль для менеджера, который содержит EditField , или вы можете использовать экран со VERTICAL_SCROLL стилем. При этом EditField автоматически прокручивается при отображении клавиатуры.

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

 class FocusableManager extends MainScreen implements FocusChangeListener
{
    private BasicEditField b;
    public FocusableManager() 
    {
        VerticalFieldManager vfm=new VerticalFieldManager(VERTICAL_SCROLL);
        vfm.add(new ButtonField("first"));
        b=new BasicEditField();
        b.setFocusListener(this);
        vfm.add(b);
        vfm.add(new ButtonField("second"));
        vfm.setMargin(250,0,0,0);
        add(vfm);
    }
    public void focusChanged(Field field, int eventType)
    {
        if(field==b)
        {
            if(eventType==1)//when edit field gain focus
            {
                VirtualKeyboard virtKbd;
                virtKbd =  getScreen().getVirtualKeyboard();
                virtKbd.setVisibility(VirtualKeyboard.SHOW_FORCE);
            }
            else if(eventType==3)//when edit field lost focus
            {
                VirtualKeyboard virtKbd;
                virtKbd =  getScreen().getVirtualKeyboard();
                virtKbd.setVisibility(VirtualKeyboard.HIDE_FORCE);
            }
        }
    }
}
  

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

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

2. кстати, в 4.5 SDK нет класса VirtualKeyboard.