在Android中检测物理菜单键按下

问题描述:

我正在尝试检测Android手机上的物理菜单按钮何时被按下。我虽然下面的代码会工作,但它不。请问我哪里错了?在Android中检测物理菜单键按下

返回的错误是'参数onKeyDown的非法修饰符;只有最终被允许”

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // Do Stuff 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+4

如果您能接受答案,这将是一件好事,因为现在已经彻底解答了这个问题。 – SK9 2012-06-27 01:51:46

如果你没有处理该事件刚刚返回true,如果你没有返回false那么Android系统可以将事件传递到其余组件来处理它。

我想寻找一个关键事件,而不是一个事件,与onKeyUp

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // ........ 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

我们将返回true,因为我们正在处理该事件;如果您希望系统也处理事件,请返回false

因为ActivityKeyEvent的已知间接子类,所以您也可以在Activity实例中执行所有操作。

+0

也看看文档[KeyEvent.Callback](http://developer.android.com/reference/android/view/KeyEvent.Callback.html),这里是一个[示例](http:// developer。 android.com/training/keyboard-input/commands.html) – 2013-11-06 06:37:48

+0

它是一个错误的答案它永远不会工作。请看下面的答案。 – 2015-04-15 11:05:25

+0

为我工作就像一个魅力。我很怀疑,因为我一开始尝试onKeyDown(),并且该菜单按钮的事件从来没有流到我的活动中,而是在“动作”工具栏中的某处消耗。 – gregko 2015-05-29 22:37:33

基于以上所有内容,这看起来是正确的实现,它将仅使用菜单键“向上”事件并将其他关键事件传递给超类。

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // ... 
     return true; 
    } else { 
     return super.onKeyUp(keyCode, event); 
    } 
} 
+0

这应该总结一下,返回true否则调用超类。 – 2013-02-23 10:07:28

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    //Checking for the "menu" key 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     if (mDrawerLayout.isDrawerOpen(mDrawerList)) { 
      mDrawerLayout.closeDrawers(); 
     } else { 
      mDrawerLayout.openDrawer(Gravity.RIGHT); 
     } 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+3

最好给出解释你的代码。 – Raptor 2013-10-24 09:50:00

+0

我正在寻找这个确切的代码:)隐藏和显示左手导航抽屉。谢谢。 – 2014-01-29 20:07:27

确保你覆盖你的Activity类中的onkeydown方法。 View类中有另一个onKeyDown方法,但如果按下菜单键,则不会调用它。

我有这个问题的一个很酷的答案:) 我已经尝试过去1年大声笑,我只是找到了解决方案3天以上请看看答案。 您需要制作一个主页观察者分隔课程。准确使用HomeWatcher名称的下面的代码。

public class HomeWatcher { 
    static final String TAG = "HomeWatcher"; 
    private Context mContext; 
    private IntentFilter mFilter; 
    private OnHomePressedListener mListener; 
    private InnerRecevier mRecevier; 

    public interface OnHomePressedListener { 
     public void onHomePressed(); 

     public void onHomeLongPressed(); 

     //public void onLockLongPressed(); 
    } 

    public HomeWatcher(Context context) { 
     mContext = context; 
     mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
    } 


    public void setOnHomePressedListener(OnHomePressedListener listener) { 
     mListener = listener; 
     mRecevier = new InnerRecevier(); 
    } 

    public void startWatch() { 
     try{ 
     if (mRecevier != null) { 
      mContext.registerReceiver(mRecevier, mFilter); 
     } 
     }catch(Exception e){} 
    } 


    public void stopWatch() { 
     try{ 
     if (mRecevier != null) { 
      mContext.unregisterReceiver(mRecevier); 
     } 
     }catch(Exception e){} 
    } 


    class InnerRecevier extends BroadcastReceiver { 
     final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
     final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; 
     final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
     final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 
     //final String SYSTEM_DIALOG_REASON_Lock = "lock"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
       String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 

       if (reason != null) { 
        Log.e(TAG, "action:" + action + ",reason:" + reason); 
        if (mListener != null) { 
         if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
          mListener.onHomePressed(); 
         } else if (reason 
           .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
          mListener.onHomeLongPressed(); 

         } 
        /* else if (reason 
           .equals(SYSTEM_DIALOG_REASON_Lock)) { 
          mListener.onLockLongPressed(); 

         }*/ 

        } 
       } 
      } 
     } 
    } 
} 

做了HomeWatcher类之后。您需要在想要检测主页按钮和最近应用按钮的所需课程中声明Homewatcher。

public class MainActivity extends Activity { 

    private HomeWatcher mHomeWatcher; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
    try { 

      mHomeWatcher = new HomeWatcher(this); 
      mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() { 
       @Override 
       public void onHomePressed() { 
        Log.e(TAG, "onHomePressed"); 


       } 
       @Override 
       public void onHomeLongPressed() { 
        Log.e(TAG, "recent apps"); 

       } 


      }); 
      mHomeWatcher.startWatch(); 
     } catch (Exception e) { 
     } 

    } 

最后,你只需要添加onPause和onResume Overide方法就可以了。

@Override 
    protected void onResume() { 
     super.onResume(); 

     try { 
      mHomeWatcher.startWatch(); 

     } catch (Exception e) { 
     } 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 

     try { 
      mHomeWatcher.stopWatch(); 

     } catch (Exception e) { 
     } 
} 

一个非常简单和美丽的答案。等待投票并接受回答:p