监听按键长按有很多方法,这个是和onkeyDown等并列提供的 一种标准方法,只是直接使用不能起作用,需要一些处理才行。 1.必现在onKeyDown 中将第一次的消息return true; 然后调用event.startTracking(); 2.可以在覆写的onKeyLongPress函数中监听到这个按键长按的事件并 做处理。 最初从福州出差期间,我始终不明白这个东西是干什么用的,就在昨天我 关机睡觉的时候才想明白了,关机时的电源键需要长按才起作用,你短按一下 没用的。顿时醒悟,或许我们一会可以用到,请各位同仁珍藏。 谢谢。 附件是这个Demo的工程,操作起来主要是看log。 /** * 这个Demo是用于监听onKeyLongPress函数的, * 一般情况下,这个函数是不会被调用的,需要做些特殊 * 处理,才能监听到按键的长按事件,除KEYCODE_ENTER * 和KEYCODE_DPAD_CENTER之外的按键。不同于view的 * onLongClickListener。 * 应用情景,比如长按一个按键,然后响应事件。 * KeyEvent的Callback回调中,只有这个函数是我们 * 不熟悉且没有使用到的。另外的onKeyDown和onKeyUp和 * onKeyMultiple都是我们常用的,这里不赘述。 * 这里以按键E做测试。 * @author dingran * */ public class LongPressTestActivity extends Activity { private final String TAG = "dingran.longpress.test.LongPressTestActivity"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } // KEYCODE_ENTER 不行 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.d(TAG, "onKeyDown keyCode = "+keyCode); // Log.d(TAG, ""+ 1/0); if(keyCode == KeyEvent.KEYCODE_E && event.getRepeatCount() == 0){ event.startTracking(); return true; }else{ return false; } // return super.onKeyDown(keyCode, event); } @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { Log.d(TAG, "onKeyLongPress keyCode = "+keyCode); if(keyCode == KeyEvent.KEYCODE_E){ Log.d(TAG, "onKeyLongPress KEYCODE_E"); return true; } return super.onKeyLongPress(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Log.d(TAG, "onKeyUp"); Log.d(TAG, "onKeyUp "+event.getFlags()); int flag = KeyEvent.FLAG_CANCELED | KeyEvent.FLAG_CANCELED_LONG_PRESS; Log.d(TAG, "onKeyUp flag = "+flag); if(event.getFlags() == flag){ Log.d(TAG, "onKeyUp in long press up"); } return super.onKeyUp(keyCode, event); } }