Android: How can I set a listener to the MenuButton?
Asked Answered
M

4

14

I want to do a custom action when pressing on the Menu button on the phone.

Is it possible to set an onClickListener (or similar) on the button and if so, how?

onCreateOptionsMenu is only called the first time the button is pressed - I've already tried this.

Mcleod answered 19/3, 2010 at 15:19 Comment(0)
M
30

Usually you shouldn't override MENU behavior as users expect menu to appear, however you can use something along these lines:

/* (non-Javadoc)
 * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ( keyCode == KeyEvent.KEYCODE_MENU ) {
        Log.d(TAG, "MENU pressed");
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
Martinet answered 19/3, 2010 at 15:37 Comment(2)
Thanks - this is what I was looking for. And dont worry - I'm not gona change the user experience but i want to do some custom actions before the menu is actually rendered.Mcleod
yanchenko has a better solution.Brio
V
19

But onPrepareOptionsMenu(..) is called each time. :)

Venation answered 19/3, 2010 at 15:27 Comment(2)
Not a very long answer, but this is the way to do it! As he said, it's called every time before the menu actually appears, so you can customise your menu in that.Vareck
Seems that for me it is not called everytime ! the first or second time it's called but then not. it is as if android knows it already prepared the menu and its in memory so it will not prepare it again.Fondness
U
3

Updated for AppCompat v.22.+

As mentioned in this forum, KeyDown is not called for KEYCODE_MENU button pressed.

The solution is to override dispatchKeyEvent to this way:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    int keyCode = event.getKeyCode();
    int action = event.getAction();
    boolean isDown = action == KeyEvent.ACTION_DOWN;

    if (keyCode == KeyEvent.KEYCODE_MENU) {
        return isDown ? this.onKeyDown(keyCode, event) : this.onKeyUp(keyCode, event);
    }

    return super.dispatchKeyEvent(event);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if ( keyCode == KeyEvent.KEYCODE_MENU ) {
        // do what you want to do here
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

It works until Google developers release a fix for this (or maybe it is not a bug and it works this way from now on).

Ursola answered 29/4, 2015 at 9:51 Comment(1)
broken in appcompat 22.1.x and at least 22.2.1 see: code.google.com/p/android/issues/detail?id=159795#c20Scramble
C
1

You could probably hack something in using "OnMenuOpened" or some such, but I really wouldn't recommend it. The menu button is only supposed to be used to show menus, so there is consistency between applications.

Clevis answered 19/3, 2010 at 15:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.