2013-09-12 3 views
12

Как заставить приложение Android реагировать на обратную связь?Как обращаться с нажатием кнопки «Назад» в приложении для Android (Delphi)?

Есть ли что-то вроде TApplicationEvents на высоком уровне, чтобы справиться с этим, или мне нужно глубоко погрузиться в низкоуровневые приложения для Android?

В настоящее время на большинстве демонстрационных приложений есть экранная кнопка назад, чтобы вернуться к предыдущему экрану. Нажатие кнопки psysical всегда покидает приложение, и в некоторых ситуациях это приводит к нарушению доступа.

+1

Больше комментарии об использовании vkHardwareBack на http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_Android_App. На этой странице упоминается техника, используемая в этом примере: http://docwiki.embarcadero.com/RADStudio/XE5/en/FireMonkey_Mobile_Application_Templates – nachbar

ответ

27

В формах 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; 
+0

Из моих тестов единственный способ, который работает в текущей версии Delphi (XE5), - это сделать Ключ: = 0; даже если пользователь нажимает «ОК, выйдите». FormKeyUp вызывается дважды (я не знаю, почему), и во второй раз отображается MessageDlg (пытается быть показан), когда приложение закрывается, поэтому все приложение зависает и не может быть перезапущено. –

+3

В XE6 и позже 'vksVisible' заменен на [TVirtualKeyboardState.Visible] (http://docwiki.embarcadero.com/Libraries/en/FMX.Types.TVirtualKeyBoardState). –

+0

Remy, вы можете обновить свой код в соответствии с моим ответом. Протестировано с XE9, –

0

извините за мое сообщение. речь шла о прекращении подачи заявки.

возврат к предыдущему экрану зависит от вашего дизайна приложения.

Если вы использовали TTabControl для отображения страниц, вы можете перейти к предыдущему TTabItem. , если вы использовали TForms для отображения страниц, вы должны использовать процедуру закрытия текущей формы и вернуться к предыдущему экрану.

1

Попробуйте это:

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; 
+0

В XE6 и позже 'vksVisible' заменяется на [TVirtualKeyboardState.Visible] (http://docwiki.embarcadero.com/Libraries/en/FMX.Types.TVirtualKeyBoardState). –

4

Вот обновленный код для ответа Реми (работает с Сиэтле):

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; 
+0

Нет XE9. Следующая версия после XE8 была 10 Сиэтл. –

+0

@RemyLebeau Спасибо. Я думаю, что не было официального имени, когда я разместил это. –

2

для будущей ссылки на тех, кто пытается разобраться в этом ..

if Key = vkHardwareBack then 
    begin 
     // your code here 
     key := 0; 
end; 

Ключ: = 0; это секрет, чтобы остановить приложение от закрытия ..

Это идет в формах OnKeyUp случае