onKeyLongPress 不适用于 KeyboardKey

onKeyLongPress not working for KeyboardKey

如何在键盘键上捕捉 onKeyLongPress。下面的代码只有在我输入“KEYCODE_VOLUME_DOWN”或“KEYCODE_VOLUME_UP”而不是“KEYCODE_Q”时才有效。我也尝试写“113”而不是“KeyEvent.KEYCODE_Q”,但没有帮助。

(如需XML请询问。)

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_Q) {
        shortPress = false;
        Toast.makeText(this, "longPress", Toast.LENGTH_SHORT).show();
        return true;
    }

    return false;
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_Q) {
        if(event.getAction() == KeyEvent.ACTION_DOWN){
            event.startTracking();
            if(event.getRepeatCount() == 0){
                shortPress = true;
            }
            return true;
        }
    }

    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_G) {
        if(shortPress){
            Toast.makeText(this, "shortPress", Toast.LENGTH_SHORT).show();
        }
        
        shortPress = false;

        return true;
    }

    return super.onKeyUp(keyCode, event);
}

对于软键盘,您应该像任何其他应用程序一样使用适当的计时器来处理长按事件。 LatinIME也使用了这个解决方案,请查看。

PointerTracker.onDownEventInternal.startLongPressTimer()

我的长按 space 键的解决方案。

private long ms_press;
...
@Override
public void onPress( int i ){
    ms_press = System.currentTimeMillis();
}
...
@Override
public void onKey( int primaryCode, int[] keyCodes) {
    if( primaryCode == 32 && (System.currentTimeMillis()-ms_press) >= 1000  ){ 
        //long press on Space key
    }else{
        //...
    }
}