如何在Android中访问onLong的菜单按钮?

时间:2012-06-03 00:39:53

标签: android menu onclicklistener onlongclicklistener

如何设置一个侦听器,以便在硬件菜单按钮上执行长按?以编程方式访问“菜单”按钮的方式是什么?

此外,如何区分长按和单击? (据我所知,当执行长按时,单击事件也会传播 - 我不希望这种情况发生,因为我需要针对这两种情况采取2种不同的操作。长按并单击单独的侦听器设备菜单按钮)

谢谢!

1 个答案:

答案 0 :(得分:2)

这个问题相当直接。查看Android开发人员网站上的KeyEvent.Callback

在那里,您会找到onKeyLongPress()以及onKeyDown()onKeyUp()。这应该让你走上正轨。如果您需要任何进一步的帮助,请评论或发布您的代码。

编辑:我刚刚重新阅读了这个问题。如果您无法区分单击与长按,则需要使用onKeyDownonKeyUp并检查点击的持续时间。实际上,您将在onKeyDown中启动计时器并检查onKeyUp中的时间。您必须注意FLAG_CANCELED

进一步编辑:我找到了做几次测试的时间。此代码应该执行您想要的操作(onKeyUp()只获取短按事件,而onLongPress()只获取长按事件。

这里的关键是调用event.startTracking()处理程序中的onKeyDown()

放在Activity中(这也应该在自定义视图中工作但未经测试):

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        // Handle Long Press here
        Log.i("KeyCheck", "LongPress");
        return true;    
    }
    return super.onKeyLongPress(keyCode, event);
}
@Override   
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.i("KeyCheck", "KeyDown" + keyCode);
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        event.startTracking(); //call startTracking() to get LongPress event
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU && event.isTracking()
            && !event.isCanceled()) {
        // handle regular key press here
        Log.i("KeyCheck", "KeyUp");
        return true;
    }
    return super.onKeyUp(keyCode, event);
}