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

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

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

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

Ответы [ 6 ]

82 голосов
/ 11 апреля 2011

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

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

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

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

11 голосов
/ 14 декабря 2012

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

public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        // ...
        return true;
    } else {
        return super.onKeyUp(keyCode, event);
    }
}
5 голосов
/ 24 октября 2013
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);
    }
}
1 голос
/ 13 марта 2015

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

0 голосов
/ 15 апреля 2015

У меня очень крутой ответ на этот вопрос. Я пробовал его в течение прошлого года и только что нашел решение.

Пожалуйста, посмотрите на ответ ниже.

Создайте класс с именем HomeWatcher.Точно используйте приведенный ниже код с именем 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 в желаемом классе, где вы хотите обнаружить кнопку «Домой» и кнопку «Последние приложения».1010 * В конце этого вам просто нужно добавить метод 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

0 голосов
/ 04 декабря 2010

Если вы обработали событие, просто верните true, если вы не вернули false, чтобы система Android могла передать событие остальным компонентам для его обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...