【问题标题】:Android: how to detect keyboard press and release events?Android:如何检测键盘按下和释放事件?
【发布时间】:2017-03-22 18:16:14
【问题描述】:

根据android documentation,检测按键释放应该很简单:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    System.out.println("pressed");
    event.startTracking();
    return true;
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    System.out.println("released");
    return true;
}

但是在尝试实现它时,它并没有按预期工作。

我需要检测何时按下蓝牙键盘的某个键,并在发生这种情况时只接收一次 onKeyDown 调用,并检测何时释放同一个键。是我做错了什么,还是有其他方法可以得到这个想要的结果?

当按下并按住任意键时,我会在控制台上反复出现:

I/System.out: pressed
I/System.out: released
I/System.out: pressed
I/System.out: released
I/System.out: pressed
I/System.out: released
I/System.out: pressed
I/System.out: released

谢谢。

【问题讨论】:

  • “它没有按预期工作”——您可能希望详细解释您期望什么以及您得到什么结果。例如,“按下时调用很多”究竟是什么?
  • 当我按下一个键并按住它时,我会反复出现:I/System.out:已按下,I/System.out:已释放。我希望当我按下它时它会“按下”一次,而当我按下它时会“释放”它,相反,当我按下任何给定的键时,“按下”和“释放”会一直重复调用......
  • 尝试从这两种方法返回false
  • 完成了,但同样的事情发生了......
  • 这个键盘有什么不寻常的地方吗?如果这是一个伪装成用于 Android 集成的蓝牙键盘的非键盘设备,您可以尝试使用更传统的蓝牙键盘重复您的测试,以查看问题是否更多出在蓝牙设备与 Android 上。我没玩过startTracking(),所以不知道有没有影响。

标签: android keyboard


【解决方案1】:
Use OnTouchListener instead of OnClickListener:

// this goes somewhere in your class:
  long lastDown;
  long lastDuration;

  ...

  // this goes wherever you setup your button listener:
  button.setOnTouchListener(new OnTouchListener() {
     @Override
     public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
           lastDown = System.currentTimeMillis();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
           lastDuration = System.currentTimeMillis() - lastDown;
        }
     }`enter code here`
  });

【讨论】:

  • 但我没有使用 OnClickListener... 我使用的是 onKeyDown 和 onKeyUp。
猜你喜欢
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多