在Android中检测物理菜单键按下
我正在尝试检测Android手机上的物理菜单button何时被按下。 我虽然下面的代码将工作,但事实并非如此。 请问我哪里错了?
返回的错误是“参数onKeyDown的非法修饰符; 只有最后被允许“
public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // Do Stuff } else { return super.onKeyDown(keyCode, event); } }
我会用onKeyUp
来寻找一个up事件,而不是down事件。
public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // ........ return true; } return super.onKeyUp(keyCode, event); }
因为我们正在处理事件,所以我们返回true
。 如果你想系统也处理事件,则返回false
。
您也可以在Activity
实例中执行所有这些操作,因为Activity
是KeyEvent
的已知间接子类。
基于以上所有,这看起来是正确的实现,它将仅消耗菜单键“up”事件并将其他关键事件传递给超类。
public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // ... return true; } else { return super.onKeyUp(keyCode, event); } }
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); } }
如果你确实处理了这个事件,那么返回true,如果你没有返回false,那么Android系统可以把这个事件传递给其余的组件来处理它。
确保在Activity类中重写onKeyDown方法。 在View类中还有另一个onKeyDown方法,但是如果按下菜单键,则不会被调用。
我有这个问题的一个非常酷的答案:)我已经尝试过去1年大声笑,我只是找出解决scheme3天以上。请看看答案。 你需要做一个主看守分隔课。 正确使用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课后。 您需要在想要检测主页button和最近应用button的所需class级上宣布“家庭观察者”。
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) { } }
一个非常简单和美丽的答案。 等待选票,并接受答案:第