移动焦点在列表字段上无法正常工作

时间:2013-05-28 09:30:38

标签: blackberry

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

enter image description here

代码在模拟器中工作正常,但它不能在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());
    }

}

1 个答案:

答案 0 :(得分:1)

替代解决方案

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

Source: 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 **/
    }
}

附加说明

对于用户界面,我喜欢在关键向上取消隐藏事件上触发事件。我认为这为用户带来了更好的体验。因此,如果您愿意,可以将keyChar()替换为keyUp(),将navigationClick()替换为navigationUnclick()