Страницы

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

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

При разработке приложения, как для Android, так и для Windows часто требуется обрабатывать нажатия на хардварные и виртуальные кнопки. В среде разработки для этого уже всё предусмотрено, поэтому я просто опишу несколько примеров.

Внимание! Старая версия заметки более не актуальна, т.к. была написана для Delphi XE5/XE6. Это новая версия заметки, актуальна для Delphi 10.3.* и выше. Если вы всё ещё используете версию Delphi ниже 10.3, то рекомендую обновиться на последнюю версию!

Обновление от 15.11.19.

Для кроссплатформенной обработки используются виртуальные ключи. Firemonkey (FMX) преобразует коды клавиш в константы виртуальных ключей, определённых в этой таблице: System.UITypes: Virtual Keys. Для отлова нажатий, отлично подходят методы «KeyDown» и «KeyUp».

Список кодов для часто используемых кнопок:
  • vkHardwareBack: Integer = $89; - Кнопка «Назад»
  • vkVolumeUp: Integer = $AF; - Кнопка «Увеличить громкость»
  • vkVolumeDown: Integer = $AE; - Кнопка «Уменьшить громкость»
  • vkMenu: Integer = $12; - Кнопка «Меню»
  • vkReturn: Integer = $D; - Кнопка «Enter»

Если вам требуется отловить нажатия кнопок на пульте (Android TV), то придётся ознакомиться с материалом ниже.
Delphi 10.3.1 – Часть нажатий на кнопки пульта не отлавливается, ознакомиться с темой «[РЕШЕНО]: Как отловить кнопки пульта ДУ» и там же забрать решение.
Delphi 10.3.2 – проблема исправлена, никаких фиксов не требуется (Подтверждение).



Примеры:

// Пример 1
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
Memo1.Lines.Add(Format('(Down)-Key: %d Hex: %0:x KeyChar: %s', [Key, KeyChar]));
Key := 0;
end;
// Пример 2
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
if Key = vkHardwareBack then
begin
// Здесь что-то делаем...
Key := 0; // Установите Key = 0 если хотите предотвратить действие кнопки по умолчанию
end;
end;


// Это новая версия ответа для Julia N -- 15.11.2019
uses
FMX.Platform, FMX.VirtualKeyboard;
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
var
KeyboardService: IFMXVirtualKeyboardService;
begin
if Key = vkHardwareBack then
if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
if TVirtualKeyBoardState.Visible in KeyboardService.VirtualKeyboardState then
Key := 0;
end;
// Это старая версия. 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
// HardwareKey - 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;