我正在处理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());
}
}
答案 0 :(得分:1)
我会为此推荐一种不同的策略。我不是试图模拟按键事件,而是定义一种方法来处理某个字母的按键,或者点击同一个字母的LabelField
。
因此,您可以使用
来处理按键操作的代码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()
。