воскресенье, 27 октября 2013 г.

Работаем с кнопками на Android устройствах

Часто при разработке приложения под мобильные устройства требуется обрабатывать нажатие на хардварные и виртуальные кнопки. В сообществе иногда появляются сообщения с вопросом как правильно обработать нажатие на кнопку "Меню/Назад" и т.п. . На самом деле всё очень просто, ниже я приведу список часто используемых кнопок (их коды для обработки), а также пример обработки нажатия на кнопку.

Update (7.04.14). Добавил ссылку на список всех кнопок

Upd (23.04.14). Проверено на Delphi XE6


  Список кодов для часто используемых кнопок:
  • Назад - 137 - vkHardwareBack
  • Громкость увеличить - 175 - $AF - vkVolumeUp
  • Громкость уменьшить - 174 - $AE - vkVolumeDown
  • Меню - 18 - $12 - sgiUpRightLong
  • Enter (Virtual Keyboard) - 13 - $D

Разберём перехват нажатия на кнопку, на примере кнопки "Назад":
if Key = vkHardwareBack then
begin
  // Здесь что-то делаем...
  Key := 0; // Установите Key = 0 если хотите предотвратить действие кнопки по умолчанию
end;

Этот код необходимо добавить в обработчик события "OnKeyUp" на вашей форме.

Итоговый код будет выглядеть так:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;  var KeyChar: Char; Shift: TShiftState);
begin
  // HardwarKey - BACK
  if Key = vkHardwareBack then
  begin
    // Здесь что-то делаем
    Key := 0;
  end;
end;

Вместо "Key = vkHardwareBack", можно писать "Key = 137". Это всё, что нужно для обработки нажатия на кнопки.

p.s. Пример обработки кнопки "Назад" есть в документации, но почему-то у некоторых всё равно возникает подобный вопрос.

UPD(28.11.13). Ответ(код в удобном для чтения виде) на вопрос в комментариях от Julia N:
var
  Form1: TForm1;
  StatusKeyboard: boolean = false;

implementation

{$R *.fmx}

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  // HardwarKey - BACK
  if Key = vkHardwareBack then
  begin
    if not StatusKeyboard then begin
      halt(0); // or MainActivity.finish;
    end;
  end;
end;

procedure TForm1.FormVirtualKeyboardHidden(Sender: TObject;
  KeyboardVisible: Boolean; const Bounds: TRect);
begin
  StatusKeyboard := False;
end;

procedure TForm1.FormVirtualKeyboardShown(Sender: TObject;
  KeyboardVisible: Boolean; const Bounds: TRect);
begin
  StatusKeyboard := True;
end;

Upd. (7.04.14)
Все возможные варианты кнопок

9 комментариев:

  1. Если на кнопку "Назад" повесить закрытие приложения, то когда открыта клавиатура, по этой кнопке должна свернуться клавиатура, а происходит закрытие приложения. Как обработать нажатие на кнопку "Назад", чтобы при открытой клавиатуре приложение не закрывалось?

    ОтветитьУдалить
    Ответы
    1. К сожалению, я пока не знаю способов нормальной работы с клавиатурой, поэтому вот вам "костыль".
      Принцип работы – отслеживаем открытие клавиатуры (запоминаем в переменную) и нажатие кнопки "Назад".
      Добавляем общую переменную "StatusKeyboard".
      Для нашей формы создаём обработчики событий "OnVirtualKeyboardShown", "OnKeyUp", "OnVirtualKeyboardHidden".
      Код добавил в конце поста, т.к. в комментариях он плохо читается.

      Это всё. Теперь приложение будет закрываться только после закрытия клавиатуры, а клавиатура будет закрываться на кнопку "Назад".

      Удалить
  2. Этот комментарий был удален автором.

    ОтветитьУдалить
  3. Где можно посмотреть весь список кодов кнопок?
    например кнопки поиск

    ОтветитьУдалить
    Ответы
    1. Вот тут: http://docwiki.embarcadero.com/Libraries/XE5/en/System.UITypes#Virtual_Keys
      Ссылку добавил в конец поста.

      Удалить
  4. Спасибо за дельную статью. Но я никак не могу найти код кнопки, который бы отвечал за нажатие кнопки "Домой"... Подскажите как обработать её нажатие?

    ОтветитьУдалить
    Ответы
    1. Отследить кнопку "Home" в "OnKeyDown" нельзя, в том числе и на Java. Но можно отслеживать события, которые происходят при нажатии этой кнопки, подробности можно найти в этой статье "http://delphifmandroid.blogspot.ru/2013/10/blog-post.html"

      Удалить
    2. Спасибо за ответ. Разобрался :-)

      Удалить
  5. Установил на форму компонент TWebBrowser. Написал обработчик KeyUp. Стоит только дотронуться до браузера и обработчик перестает работать. Как сделать чтобы при нажатии кнопки системной Назад браузер возвращался на предыдущую страницу?

    ОтветитьУдалить