Подтвердить что ты не робот

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

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

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

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

Ответ 1

Я бы поискал ключевое событие up, а не событие 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.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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