Как мне обрабатывать нажатие кнопки "Назад" в приложении для Android (Delphi)?
Как заставить приложение Android реагировать на кнопку "Назад"?
Есть ли что-то для VCL TApplicationEvents на высоком уровне, или мне нужно глубоко погрузиться в низкоуровневые приложения для Android?
В настоящее время в большинстве демонстрационных приложений есть экранная кнопка назад, чтобы вернуться к предыдущему экрану. Нажатие кнопки psysical всегда кажется, что выходите из приложения, и в некоторых ситуациях это приводит к нарушению доступа.
Ответы
Ответ 1
В форме OnKey...
события параметр Key
vkHardwareBack
на Android. Например:
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;
Ответ 2
Вот обновленный код для ответа Реми (работает с Сиэтлом):
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;
Ответ 3
В будущем обратитесь к любому, кто пытается понять это.
if Key = vkHardwareBack then
begin
// your code here
key := 0;
end;
Ключ: = 0; это секрет, чтобы остановить приложение от закрытия.
Это относится к формам события OnKeyUp
Ответ 4
Возвращение к предыдущему экрану зависит от дизайна вашего приложения.
Если вы использовали TTabControl
для отображения страниц, вы можете перейти к предыдущему TTabItem
.
Если вы использовали TForms
для отображения страниц, вы должны использовать процедуру Close()
, чтобы закрыть текущую форму и вернуться к предыдущему экрану.
Ответ 5
Попробуйте следующее:
uses FMX.Platform,FMX.VirtualKeyboard,FMX.Helpers.Android;
procedure THeaderFooterForm.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
if MessageDlg('Exit Application?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbCancel], -1) = mrOK then
begin
// Exit application here...
SharedActivity.Finish;
end;
end;
end
else
// Menu button pressed
if Key = sgiUpRightLong then
begin
showmessage('Menu button pressed');
end;
end;