Blackberry 黑莓软件键盘监听器操作系统4.5(或更高版本)兼容代码

Blackberry 黑莓软件键盘监听器操作系统4.5(或更高版本)兼容代码,blackberry,java-me,soft-keyboard,Blackberry,Java Me,Soft Keyboard,我正在开发一个应用程序,该应用程序应该可以在OS4.5或更高版本的设备上运行。在我的应用程序中,我需要知道虚拟键盘何时可见或不可见。因为如果虚拟键盘是可见的,那么用户应该输入的文本区域就在键盘后面。如果我能确定虚拟键盘状态改变的时刻,我就能刷新屏幕并将文本区域移到上面的位置 有办法吗 编辑:下一步按钮位于状态面板。编辑字段位于自定义水平字段管理器中 当我触摸编辑字段时,虚拟键盘打开,编辑字段的内容丢失 没有此事件,但您可以确定虚拟键盘的当前状态并设置所需状态。 比如把它藏起来 if(V

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

有办法吗

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

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


没有此事件,但您可以确定虚拟键盘的当前状态并设置所需状态。 比如把它藏起来

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

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

为保存
编辑字段的管理器设置
垂直滚动
样式,或者您可以使用带有
垂直滚动
样式的屏幕。这样,当显示键盘时,
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);
            }
        }
    }
}

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

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

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

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


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


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

正如我之前所说,我必须用4.5及以上的SDK实现该代码
VirtualKeyboard
类在4.7SDK之后可用。所以这不是答案。用这种说法是不可能的。@Ahmet Gulden,对4.7+代码@Micheal B使用预处理器指令。预处理器指令听起来不错。我要试一试。但无论如何我都应该有一个监听器来监听键盘事件。实际上,我在管理器上使用了
垂直滚动
,该管理器保存自定义水平管理器,该管理器保存editfield。顺便说一句,4.5 SDK中没有VirtualKeyboard类。问题是我不知道屏幕宽度和高度何时变化。你可以通过重写setLayout方法。它总是调用任何维度更改的方法Next按钮与editfield位于不同的面板上。我不能把它移到那里,因为整个实现逻辑都会崩溃。你是说用于条件编译的Class.forName(…)?