Обнаружение физического нажатия клавиши меню на Android

Я пытаюсь обнаружить, когда была нажата кнопка физического меню на моем телефоне Android. Я, хотя код ниже работал, но это не так. Где я ошибаюсь, пожалуйста?

Возвращенная ошибка: «Недействительный модификатор для параметра onKeyDown; Разрешено только окончательное "

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

Solutions Collecting From Web of "Обнаружение физического нажатия клавиши меню на Android"

Я бы onKeyUp ключевое событие, а не событие down , с onKeyUp .

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

Мы возвращаем true потому что мы обрабатываем событие; Return false если вы хотите, чтобы система также обрабатывала событие.

Вы можете сделать все это в своем экземпляре Activity потому что Activity является известным косвенным подклассом KeyEvent .

Исходя из всего вышеизложенного, это, по-видимому, правильная реализация, которая будет потреблять только клавиши меню «вверх» и передавать другие ключевые события в суперкласс.

 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 могла передать событие остальным компонентам для его обработки.

Убедитесь, что вы переопределили метод onKeyDown в своем классе Activity. В классе View есть еще один метод onKeyDown, но он не будет вызван, если нажата клавиша меню.

У меня очень крутой ответ на этот вопрос 🙂 Я пробовал за последний год, и я только что нашел решение за 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