How do I handle a back-button press in a (Delphi) Android app?
In the form's OnKey...
events, the Key
parameter is vkHardwareBack
on Android. For example:
uses FMX.Platform, FMX.VirtualKeyboard;procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);var FService : IFMXVirtualKeyboardService;begin if Key = vkHardwareBack then begin TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService)); if (FService <> nil) and (vksVisible in FService.VirtualKeyBoardState) then begin // Back button pressed, keyboard visible, so do nothing... end else begin // Back button pressed, keyboard not visible or not supported on this platform, lets exit the app... if MessageDlg('Exit Application?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbCancel], -1) = mrOK then begin // Exit application here... end else begin // They changed their mind, so ignore the Back button press... Key := 0; end; end; end ...end;
For future reference to anyone trying to make sense of this..
if Key = vkHardwareBack then begin // your code here key := 0;end;
The key := 0; is the secret to stop the app from closing..
This goes in the forms OnKeyUp event
Here is an updated code for Remy's answer (works with Seattle):
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);var FService : IFMXVirtualKeyboardService;begin if Key = vkHardwareBack then begin TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService)); if (FService <> nil) and (TVirtualKeyboardState.Visible in FService.VirtualKeyBoardState) then begin // Back button pressed, keyboard visible, so do nothing... end else begin Key := 0; // Back button pressed, keyboard not visible or not supported on this platform, lets exit the app... MessageDlg('Exit Application?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbCancel], -1, OnCloseDialog); end; end;end;procedure TForm1.OnCloseDialog(Sender: TObject; const AResult: TModalResult);begin if AResult = mrOK then Close;end;