Как убрать фокус из текстового поля LWUIT и правильно изменить размер формы, когда скрывается виртуальная клавиатура?
У меня проблема с текстовым полем LWUIT.
В некоторых моих формах я отображаю панель категорий, в то время как в других я скрываю ее.
В некоторых формах, в которых у меня есть текстовые поля, проблема возникает, когда я сосредотачиваюсь на одном и заставляю виртуальную клавиатуру (VKB) появляться. Когда появляется VKB, компоненты экрана изменяют свой размер, чтобы приспособиться к текстовому полю, которое будет видно при вводе текста, но когда я скрываю VKB, либо с помощью кнопки "Назад" или клавиши возврата на VKB, текстовое поле остается с фокусом, Мало того, что, когда компоненты экрана изменяют свой размер, текущая видимая Форма изменяет свой размер так, как если бы отсутствовала CategoryBar, поэтому любые компоненты, находящиеся в нижней части формы, скрыты CategoryBar.
Это исправлено путем отображения другой формы (в том числе PopupChoiceGroup и DatePicker), а затем возврата к форме, которая покрывается CategoryBar.
В других формах, где панель категорий не видна, иногда изменение размера при отображении VKB приводит к тому, что формы изменяют свой размер, как если бы панель категорий была видимой, что позволяет взаимодействовать с ним, когда он не должен быть доступен.
Как я могу убедиться, что фокус на текстовом поле полностью потерян? Кроме того, как убедиться, что размер формы правильно изменен независимо от того, видна ли панель категорий или нет?
РЕДАКТИРОВАТЬ
Я копался в ссылках на классы для TextField, Form и VKB, позже я нашел метод с именем autoAdjust, который согласно документации:
Автоматическая настройка размера диалога. Этот метод запускается из события sizeChanged.
Метод sizeChanged звучит как то, что я должен проверить, и в ссылке на форму описание этого метода:
Этот метод вызывается только тогда, когда базовый холст для формы получает событие изменения размера. Этот метод вызовет ретрансляцию формы. Этот метод получит обратный вызов, только если эта форма является текущей формой
Этот метод выглядел как обратный вызов для изменения размера, который я искал, поэтому я переопределил его и поместил для отображения NotificatioBar со значениями ширины и высоты, отправленными при вызове метода.
После того, как я протестировал это на своем устройстве, я обнаружил, что при изменении размера формы после того, как VKB был показан или скрыт, значение высоты иногда вместо 270 (высота формы при отображении панели категорий) отправлялось как 320 (полная высота экрана, как если бы не отображалась панель категорий).
До сих пор я не смог понять, почему Форма игнорирует тот факт, что CategoryBar отображается или нет при изменении размера самого.
Я попытался изменить высоту формы внутри метода sizeChanged, но форма не затронула его. Мне кажется, что мне нужно изменить холст, на котором рисуется форма, но я не совсем уверен, так как холст скрыт в LWUIT.
Может ли это быть холст, на котором нарисована моя форма? Что провоцирует это поведение?
1 ответ
На данный момент я нашел обходной путь, чтобы избежать скрытия моих компонентов CategoyBar, потому что форма неправильно изменяла размер после того, как VKB скрылся, для сценария, в котором форма изменяет размер неправильно и отображает CategoryBar (который я не знаю, почему отображается, если Я вызываю его метод setVisibility и передаю false).
Сначала я переопределил метод sizeChanged:
protected void sizeChanged(int w, int h){
if(h > 270){
mainContainer.getStyle().setMargin(Component.BOTTOM, 50);
}
else{
mainContainer.getStyle().setMargin(Component.BOTTOM, 0);
}
}
Я проверяю значение высоты, если это значение превышает ожидаемую высоту, когда отображается CategoryBar, тогда я устанавливаю нижнюю часть моего Контейнера на 50, чтобы она была видна.
Но этого было недостаточно, потому что если я снова покажу ту же форму и она правильно изменит размер, то Контейнер останется с дном 50. Поэтому я переопределил метод onShow:
protected void onShow(){
int containerBottom = mainContainer.getStyle().getMargin(Component.BOTTOM);
if(this.getHeight() == 270 && containerBottom == 50){
mainContainer.getStyle().setMargin(Component.BOTTOM, 0);
}
}
Я должен был убедиться, что если высота была 270, а дно моего Контейнера было 50, то дно Контейнера должно быть 0.
Поскольку я не нашел способа избежать изменения размера моей формы и отображения панели категорий, когда она вообще не должна отображаться, я не считаю себя полным ответом. Будет ли обновление, если я найду обходной путь для этого.
РЕДАКТИРОВАТЬ
Я попытался явно установить показанный / скрытый статус, вызвав метод setVisibility внутри метода onShow каждой формы, которую я имею. До сих пор мне удавалось избежать проблем со зрением, с которыми я сталкивался ранее. Я не уверен, была ли эта проблема из-за LWUIT или из-за ограничений J2ME, но я так обошелся.