¿Cómo puedo hacer que mi aplicación para Android reaccionar con el botón atrás?

Hay algo como de alto nivel de la VCL de la TApplicationEvents a manejar, o tengo que bucear profundamente en bajo nivel de Android específicos cosas aquí?

Ahora, la mayoría de la demo de las aplicaciones tienen una pantalla de botón atrás para volver a la pantalla anterior. Presionando la psysical botón siempre parece salir de la aplicación, y en algunas situaciones se produce una infracción de acceso.

Más comentarios sobre el uso de vkHardwareBack en docwiki.embarcadero.com/RADStudio/XE5/en/…. Que página menciona la técnica utilizada en este ejemplo: docwiki.embarcadero.com/RADStudio/XE5/en/…

OriginalEl autor Wouter van Nifterick | 2013-09-12

5 Comentarios

  1. 31

    Del formulario OnKey... eventos, el Key parámetro es vkHardwareBack en Android. Por ejemplo:

    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;
    De mis pruebas, la única forma en que esto funciona en la versión actual de Delphi (XE5) si realiza la Tecla := 0; incluso si el usuario presiona «OK, exit». El FormKeyUp se llama dos veces (no sé por qué) y la segunda vez que el MessageDlg (tratado de ser demostrado), mientras que la app se cierra de modo que toda la aplicación se bloquea y no puede ser reiniciado.
    En XE6 y más tarde el vksVisible se sustituye con TVirtualKeyboardState.Visible.
    Remy, usted puede actualizar su código de acuerdo con mi respuesta. Probado con XE9,
    No, él no debe actualizar su respuesta porque, OP pidió XE5 ^^, pero @LU RD proporcionado la única modificación requerida (al menos para mí, con XE7…)

    OriginalEl autor Remy Lebeau

  2. 5

    Aquí es una versión actualizada del código de Remy de la respuesta (funciona con 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;
    No hay XE9. La próxima versión después de XE8 fue de 10 Seattle.
    Gracias. Creo que no había nombre oficial, cuando he publicado este.

    OriginalEl autor Sergey Krasilnikov

  3. 5

    Para referencia en el futuro para cualquier persona tratando de hacer sentido de esta..

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

    La tecla := 0; es el secreto para detener la aplicación se cierre..

    Esto va en la formas evento OnKeyUp

    OriginalEl autor Jean-Michele Groenewald

  4. 1

    Intente esto:

    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;
    En XE6 y más tarde el vksVisible se sustituye con TVirtualKeyboardState.Visible.

    OriginalEl autor Ingo

  5. 0

    lo siento por mi anterior mensaje. fue sobre la terminación de la aplicación.

    volver a la pantalla anterior depende de su diseño de la aplicación.

    si usted utiliza TTabControl para la visualización de las páginas, usted puede navegar a la anterior TTabItem.
    si usted utiliza TForms para la visualización de las páginas, debe usar Close() procedimiento para el cierre de la forma actual y volver a la pantalla anterior.

    OriginalEl autor suathd

Dejar respuesta

Please enter your comment!
Please enter your name here