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

Posted

技术标签:

【中文标题】如何在Android中访问菜单按钮onLongClick?【英文标题】:How to access menu button onLongClick in Android? 【发布时间】:2012-06-07 16:24:36 【问题描述】:

如何为硬件菜单按钮上的长按设置监听器?以编程方式访问菜单按钮的方式是什么?

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

谢谢!

【问题讨论】:

【参考方案1】:

这应该是相当直截了当的。查看 android 开发者网站上的KeyEvent.Callback。

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

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

进一步编辑:我有时间做几个测试。这段代码应该做你想做的(onKeyUp() 只得到短按事件,onLongPress() 只得到长按事件)。

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

放置在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);

【讨论】:

这很好用,在这里跟踪真的很有帮助。谢谢! 它在我的情况下不起作用。我想按住菜单键不显示软键盘。您的解决方案甚至禁用了我的菜单选项。 我同意如果您根本不希望菜单工作,它会很好地工作,完全禁用单按菜单。当您不想忽略单按时,有没有办法使这项工作?

以上是关于如何在Android中访问菜单按钮onLongClick?的主要内容,如果未能解决你的问题,请参考以下文章

如何在主页中打开后退按钮 android 以退出应用程序并关闭反应本机导航侧菜单

如何为Android应用程序统一访问手机后退按钮

HTML / JS 下拉菜单按钮不会放在 Android Studio WebView 中

如何在Android平板电脑POWER按钮菜单中添加休眠功能

如何使用菜单按钮将数据从活动传递到android中的片段?

如何访问 Siri Remote 播放/暂停按钮和覆盖菜单按钮