Как получить доступ к кнопке меню на LongClick в Android?

Как я могу настроить прослушиватель для длинного щелчка, выполняемого на аппаратной кнопке меню? Как осуществляется программный доступ к кнопке Меню?

Кроме того, как я могу отличить длинный щелчок от одиночного? (Насколько я знаю, когда выполняется длинный щелчок, также распространяется событие одиночного щелчка - я не хочу, чтобы это произошло, потому что мне нужно 2 разных действия для этих двух ситуаций. Длинный щелчок и одиночный щелчок отдельные слушатели для кнопку Меню устройства)

Благодарю вас!


person alex    schedule 03.06.2012    source источник


Ответы (1)


Это должно быть довольно прямолинейно. Ознакомьтесь с KeyEvent.Callback на веб-сайте разработчика Android.

Там вы найдете onKeyLongPress(), а также onKeyDown() и onKeyUp(). Это должно привести вас на правильный путь. Прокомментируйте или опубликуйте свой код, если вам нужна дополнительная помощь.

Изменить: я только что перечитал вопрос. Если вы не можете отличить одиночный клик от длинного, вам нужно будет использовать onKeyDown и onKeyUp и проверить продолжительность клика. По сути, вы запустите таймер в onKeyDown и проверите время в onKeyUp. Вам придется следить за FLAG_CANCELED.

Дальнейшее редактирование: я нашел время, чтобы сделать пару тестов. Этот код должен делать то, что вы хотите (onKeyUp() получает только события короткого нажатия, а onLongPress() получает только события длительного нажатия).

Ключевым моментом здесь является вызов event.startTracking() в обработчике onKeyDown().

Поместите в Activity (это также должно работать в пользовательском представлении, но не проверено):

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        // Handle Long Press here
        Log.i("KeyCheck", "LongPress");
        return true;    
    }
    return super.onKeyLongPress(keyCode, event);
}
@Override   
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.i("KeyCheck", "KeyDown" + keyCode);
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        event.startTracking(); //call startTracking() to get LongPress event
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU && event.isTracking()
            && !event.isCanceled()) {
        // handle regular key press here
        Log.i("KeyCheck", "KeyUp");
        return true;
    }
    return super.onKeyUp(keyCode, event);
}
person cstrutton    schedule 03.06.2012
comment
это работает просто прекрасно, здесь действительно помогает отслеживание. Спасибо! - person alex; 03.06.2012
comment
В моем случае это не работает. Я хочу, чтобы удержание клавиши меню не отображало виртуальную клавиатуру. Ваше решение даже отключило мои параметры меню. - person emeraldhieu; 18.09.2012
comment
Я согласен, отлично работает, если вы не хотите, чтобы меню работало вообще, полностью отключает меню одним нажатием. Есть ли способ заставить это работать, когда вы не хотите игнорировать одно нажатие? - person JPM; 28.11.2012