#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.