2010-03-19 73 views

回答

30

通常你不应该重写MENU行为,用户所期望的菜单出现,但是你可以使用这些方针的东西:

/* (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); 
} 
+1

谢谢 - 这就是我一直在寻找的东西。别担心 - 我不会改变用户体验,但我想在菜单实际呈现之前执行一些自定义操作。 – Mannaz 2010-03-22 09:34:16

+0

yanchenko answert应该是被接受的。 – 2013-04-03 13:32:13

+0

yanchenko有更好的解决方案。 – katzenhut 2014-08-22 12:55:51

1

你可能会使用“OnMenuOpened”或其他方法破解一些东西,但我真的不会推荐它。菜单按钮只能用于显示菜单,所以应用程序之间的一致性。

19

但是每次都调用onPrepareOptionsMenu(..)。 :)

+1

不是很长的答案,但这是做到这一点的方法!正如他所说的,每次菜单实际出现之前都会调用它,因此您可以自定义菜单。 – 2010-03-19 15:58:50

+0

应该是被接受的答案。 – katzenhut 2014-08-22 12:55:06

+0

似乎这对我来说并不是每次都被调用!第一次或第二次被叫,但不是。就好像android知道它已经准备好菜单和它的内存,所以它不会再准备它。 – Mercury 2017-04-03 23:22:38

3

更新了程序兼容性V.22 +

由于在这个forum中提到,KeyDown不被要求按下KEYCODE_MENU按钮。

的解决方案是重写dispatchKeyEvent以这种方式:

@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); 
} 

它的工作原理,直到谷歌开发者发布此修复程序(或者它是不是一个错误,它从现在开始以这种方式工作)。

+2

在appcompat 22.1.x中损坏,至少22.2.1请参阅:https://code.google.com/p/android/issues/detail?id=159795#c20 – 2015-07-31 01:15:07