我正在开发一个应用程序,它应该可以在具有 OS 4.5 或更高版本的设备上运行。在我的应用程序中,我需要知道虚拟键盘何时可见或不可见。因为如果虚拟键盘是可见的,那么用户应该输入的文本区域就在键盘后面。如果我可以确定虚拟键盘状态发生变化的时刻,我可以刷新屏幕并将文本区域移动到上方位置。
有没有办法做到这一点?
编辑:下一个按钮位于状态面板上。编辑字段位于自定义水平字段管理器中。
当我触摸编辑字段时,虚拟键盘会打开并且编辑字段的内容会丢失。
我正在开发一个应用程序,它应该可以在具有 OS 4.5 或更高版本的设备上运行。在我的应用程序中,我需要知道虚拟键盘何时可见或不可见。因为如果虚拟键盘是可见的,那么用户应该输入的文本区域就在键盘后面。如果我可以确定虚拟键盘状态发生变化的时刻,我可以刷新屏幕并将文本区域移动到上方位置。
有没有办法做到这一点?
编辑:下一个按钮位于状态面板上。编辑字段位于自定义水平字段管理器中。
当我触摸编辑字段时,虚拟键盘会打开并且编辑字段的内容会丢失。
你有两个选择。第一个选择更好:
找出适用于可见或隐藏键盘的不变量。当键盘的可见性状态改变时调用屏幕布局方法,并且为可见键盘减小垂直尺寸。如果您的不变量利用了这一点,那么您可以在屏幕布局方法中实现逻辑。
在这种情况下,我会建议一种布局方法,始终将“下一步”按钮保留在屏幕底部,并将用户名文本框放在剩余空间的中心。
使用条件编译,这样您就可以编写引用 OS 4.7+ 上的 VirtualKeyboard 类的代码,并且该代码在较早的 BlackBerry 版本中消失。7 月 4 日:通过条件编译,我的意思是使用 BlackBerry 预处理器。
没有办法用相同的代码做到这一点。您需要将代码一分为二。其中之一处理 4.5 - 4.7。另一个处理 4.7 及更高版本。
您可以在 4.7(及更高版本)代码中添加键盘侦听器,以检查屏幕是否在连续线程中发生变化。这不好,但它可以工作。
这没有事件,但您可以确定虚拟键盘的当前状态并设置所需的状态。例如隐藏它
if(VirtualKeyboard.isSupported() == true){
VirtualKeyboard keyboard = getVirtualKeyboard();
if(keyboard != null)
keyboard.setVisibility(VirtualKeyboard.HIDE);
}
这是一项相当具有挑战性的工作。但是,我相信没有直接的 API 或方法来确定虚拟键盘状态。唯一的方法是重写该setLayout()
方法并确定屏幕宽度和高度是否已更改。您还需要检查屏幕的 GUI 布局。
VERTICAL_SCROLL
为拥有 的 Manager设置样式EditField
,或者您可以使用具有VERTICAL_SCROLL
样式的 Screen。这样做,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);
}
}
}
}