3

我正在开发一个应用程序,它应该可以在具有 OS 4.5 或更高版本的设备上运行。在我的应用程序中,我需要知道虚拟键盘何时可见或不可见。因为如果虚拟键盘是可见的,那么用户应该输入的文本区域就在键盘后面。如果我可以确定虚拟键盘状态发生变化的时刻,我可以刷新屏幕并将文本区域移动到上方位置。

有没有办法做到这一点?

编辑:下一个按钮位于状态面板上。编辑字段位于自定义水平字段管理器中。

在此处输入图像描述

当我触摸编辑字段时,虚拟键盘会打开并且编辑字段的内容会丢失。

在此处输入图像描述

4

5 回答 5

2

你有两个选择。第一个选择更好:

  • 找出适用于可见或隐藏键盘的不变量。当键盘的可见性状态改变时调用屏幕布局方法,并且为可见键盘减小垂直尺寸。如果您的不变量利用了这一点,那么您可以在屏幕布局方法中实现逻辑。
    在这种情况下,我会建议一种布局方法,始终将“下一步”按钮保留在屏幕底部,并将用户名文本框放在剩余空间的中心。

  • 使用条件编译,这样您就可以编写引用 OS 4.7+ 上的 VirtualKeyboard 类的代码,并且该代码在较早的 BlackBerry 版本中消失。7 月 4 日:通过条件编译,我的意思是使用 BlackBerry 预处理器。

于 2011-07-02T01:07:27.287 回答
2

没有办法用相同的代码做到这一点。您需要将代码一分为二。其中之一处理 4.5 - 4.7。另一个处理 4.7 及更高版本。

您可以在 4.7(及更高版本)代码中添加键盘侦听器,以检查屏幕是否在连续线程中发生变化。这不好,但它可以工作。

于 2011-07-04T21:49:38.557 回答
1

这没有事件,但您可以确定虚拟键盘的当前状态并设置所需的状态。例如隐藏它

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

        if(keyboard != null)
            keyboard.setVisibility(VirtualKeyboard.HIDE);
    }
于 2011-06-09T09:59:53.870 回答
1

这是一项相当具有挑战性的工作。但是,我相信没有直接的 API 或方法来确定虚拟键盘状态。唯一的方法是重写该setLayout()方法并确定屏幕宽度和高度是否已更改。您还需要检查屏幕的 GUI 布局。

于 2011-06-28T18:19:33.717 回答
0

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);
            }
        }
    }
}
于 2011-06-28T08:28:39.890 回答