2011-02-19 44 views
2

可能重复的两个实例:
public boolean onKey() called twice?机器人:onKeyListener模拟按键

Display.setOnKeyListener(new OnKeyListener() { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     switch (keyCode) { 
      case KeyEvent.KEYCODE_ENTER: 
       solveExpression(); 
       return true; 
     } 
     return false; 
    } 
}); 

我试图解决包含在显示器(的EditText)内的表达,通过按下键盘上的输入按钮,它总是将它解释为我按了两次按钮。有谁知道为什么发生这种情况?

+0

我不是一个机器人的家伙,但代码对我来说很好。请检查哪个是keyCode(是66)? – zengr 2011-02-19 03:19:42

回答

0

不是一个android家伙,但它注册两次的事实使我认为OnKey包含onKeyDown和onKeyUp。听onKeyUp会为你工作吗?

4

的Try ...

Display.setOnKeyListener(new OnKeyListener() {  
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     switch (keyCode) { 
      case KeyEvent.KEYCODE_ENTER: 

       // Check for ACTION_DOWN only... 
       if (KeyEvent.ACTION_DOWN == event.getAction()) { 
        solveExpression(); 
        return true; 
       } 
     } 
    } 
}); 

'操作' 可以ACTION_DOWNACTION_UPACTION_MULTIPLE(最后一次是当一个键被按下并保持)。 onKey()将被调用任何/所有这些操作。

正如其他答案所提到的那样,它会触发两次,因为它曾经是下来,一次是上涨。

+0

只在`KeyEvent.ACTION_DOWN`上触发许多调试输出才会触发logcat中的许多调试输出:`ACTION_DOWN,但键已关闭,此事件不是重复键。 – ForeverLearning 2015-08-05 16:20:12

+0

这样做会停止监听keyevent dpad_center as onClick – 2016-04-07 10:58:30

2
if (event.getAction()!=KeyEvent.ACTION_DOWN) // we catch only key down events 
    return true; 

因此,您停止监听其他keyevents作为onClick。

如果在链得到了另一块工作的情况下,希望别人进一步,你应该设置

return false;