1

我正在研究ListView部分,在此,用户可以按名称搜索内容,并通过按键盘按钮直接移动到 List 的第一个元素。就像,如果您从(右侧垂直管理器)按下按钮 B,它将滚动列表并将焦点移动到 B 的第一条记录。

在此处输入图像描述

该代码在模拟器中运行良好,但在 Touch 设备上无法运行 - 我有 BB 9380 曲线。

这是代码:

LabelField a = new LabelField("A" , FOCUSABLE)
{
    protected void paint(Graphics graphics) 
    {
        graphics.setColor(0xC4C4C4);
        super.paint(graphics);
    }

    protected boolean navigationClick(int status, int time) 
    {
        //fieldChangeNotify(1);
        injectKey(Characters.LATIN_CAPITAL_LETTER_A);
        injectKey(Characters.LATIN_CAPITAL_LETTER_A);
        return true;
    }
};

private void injectKey(char key) 
{
    try 
    {
        searchList.setFocus();
        KeyEvent inject = new KeyEvent(KeyEvent.KEY_DOWN, key, 0);
        inject.post();
        /*inject.post();*/

    } catch (Exception e) {
        Log.d("In injectKey :: :: :: "+e.toString());
        MessageScreen.msgDialog("In Inject Key "+e.toString());
    }

}
4

1 回答 1

1

替代解决方案

我会为此推荐一种不同的策略。我不会尝试模拟按键事件,而是定义一种方法来处理某个字母的按键,或者触摸单击同一个字母的LabelField.

资料来源:blackberry.com

因此,您可以使用处理按键的代码

protected boolean keyChar( char character, int status, int time ) 
{
    // you might only want to do this for the FIRST letter entered,
    //   but it sounds like you already have the keypress handling
    //   the way you want it ...
    if( CharacterUtilities.isLetter(character) )
    {
        selectLetter(character);
        return true;
    }

    return super.keyChar( character, status, time );
}

然后还处理触摸事件:

LabelField a = new LabelField("A" , FOCUSABLE)
{
    protected void paint(Graphics graphics) 
    {
        graphics.setColor(0xC4C4C4);
        super.paint(graphics);
    }

    protected boolean navigationClick(int status, int time) 
    {
        char letter = getText().charAt(0);
        selectLetter(letter);
        return true;
    }
};

然后,只需定义一个接收一个字符的方法,并滚动到列表中该部分的开头:

private void selectLetter(char letter);

密钥注入

但是,如果您真的非常想模拟按键,您可以尝试更改代码,使其注入两个事件:按下键,然后按下键(您当前正在注入两个按下键事件)。这可能会导致问题。

    injectKey(Characters.LATIN_CAPITAL_LETTER_A, true);
    injectKey(Characters.LATIN_CAPITAL_LETTER_A, false);

private void injectKey(char key, boolean down) 
{
    try 
    {
        searchList.setFocus();
        int event = down ? KeyEvent.KEY_DOWN : KeyEvent.KEY_UP;
        KeyEvent inject = new KeyEvent(event, key, 0);
        inject.post();
    } catch (Exception e) { /** code removed for clarity **/
    }
}

附加说明

对于 UI,我喜欢在 key upunclick事件上触发事件。我认为这为用户提供了更好的体验。所以,如果你想这样做,你可以keyChar()keyUp()navigationClick()替换。navigationUnclick()

于 2013-05-30T00:52:25.040 回答