AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Android BackButton..

Ein Thema von erich.wanker · begonnen am 27. Jul 2017 · letzter Beitrag vom 27. Jul 2017
Antwort Antwort
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
461 Beiträge
 
Delphi XE4 Professional
 
#1

Android BackButton..

  Alt 27. Jul 2017, 12:04
Hallo Leute,

Delphi Tokyo / Android app

Ich will beim Andoid/BackButton nicht aus meiner AndroidApp geworfen werden, sondern mein "Hauptmenue" aufrufen, leider finde ich nix was funktioniert...

Alles was ich gefunden habe ist ähnlich wie mein Versuch: es comiliert schön - macht aber nix

Delphi-Quellcode:
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
            if ausrichtung='hochthen maincontrol.ActiveTab:=menu;
            if ausrichtung='querthen maincontrol.ActiveTab:=menu2;
            key:=0;
        end

      end;
end;
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#2

AW: Android BackButton..

  Alt 27. Jul 2017, 12:36
Delphi-Quellcode:
procedure TfrmPscreen.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
var
  FService : IFMXVirtualKeyboardService;
begin
  if (Key = vkHardwareBack) or (Key = vkHome) 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;
    Exit;
  end;

  if Key = sgiUpRightLong then begin // Menu button pressed ?
    showmessage(verToolV1);
    Exit;
  end;

end;

procedure TfrmPscreen.OnCloseDialog(Sender: TObject; const AResult: TModalResult);
begin
  if AResult = mrOK then begin
    if Assigned(FrmQscreen) then FrmQscreen.Close;
    if Assigned(FrmPscreen) then FrmPscreen.Close;
    Close;
  end;
end;

da siehst du wie man die "SystemButtons" nutzt, auch der aktuell fast nicht mehr zufindende "Menu" Button ist abfragbar und hier einfach mal eine "VersionInfo"
der BackButton schließt hier nicht sofort, sondern erst wenn es der Nutzer ausdrücklich bestätigt... da kannste aber auch beliebg anderes abhängig vom AppState programmieren

Geändert von mensch72 (27. Jul 2017 um 12:40 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#3

AW: Android BackButton..

  Alt 27. Jul 2017, 12:37
Probier mal das ...

Delphi-Quellcode:
// Processes the KeyUp in Forms, to standard behaviour of Android Back key
function Form_KeyUp_Back(const AForm : TCustomForm; var Key: Word; var KeyChar: Char; Shift: TShiftState; bCanTerminate : Boolean) : Boolean;
{$IF DEFINED(ANDROID) or DEFINED(IOS) }
var
  FService : IFMXVirtualKeyboardService;
{$ENDIF DEFINED(ANDROID) or DEFINED(IOS) }
begin

  Result := False;

  //V3
  if Key = vkHardwareBack then
  begin

{$IF DEFINED(ANDROID) or DEFINED(IOS) }
    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;
      Result := True;

      // Back button pressed, keyboard not visible or not supported on this platform,
      // lets exit the app... if condition is met
      // !! Mobile apps cannot be terminated
      if bCanTerminate then
      begin

      end;

    end;
{$ENDIF DEFINED(ANDROID) or DEFINED(IOS) }

  end;

end;

procedure TMain_Frm.FormKeyUp(Sender: TObject; var Key: Word;
  var KeyChar: Char; Shift: TShiftState);
begin

{$IFDEF ANDROID}
  if Form_KeyUp_Back(Self, Key, KeyChar, Shift, True) then
  begin
    if TabControlHeader.ActiveTab <> TabItemH1ViewEntry then
    begin

      ....

    end else
    begin
      // May Finish the main Form here, w/o closing it

      View_Hide;
    end;

    Exit;
  end;
{$ENDIF ANDROID}

  if Key = vkReturn then
  begin

  end;

end;
Rollo
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
461 Beiträge
 
Delphi XE4 Professional
 
#4

AW: Android BackButton..

  Alt 27. Jul 2017, 14:06
Hallo Leute
vielen Dank .. funktioniert jetzt einwandfrei ...


Delphi-Quellcode:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
var
  FService : IFMXVirtualKeyboardService;
begin
  if (Key = vkHardwareBack) or (Key = vkHome) then begin
    TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
    if (FService <> nil) and (TVirtualKeyboardState.Visible in FService.VirtualKeyBoardState) then
    begin
         // Tastatur ist eingeblendet .. also nix tun
    end
    else
    begin
      Key := 0;
      if (maincontrol.ActiveTab <> menu) AND (maincontrol.ActiveTab <> menu2) AND (maincontrol.ActiveTab <> login) AND (maincontrol.ActiveTab <> login2) then
      begin
            if ausrichtung='hochthen maincontrol.ActiveTab:=menu;
            if ausrichtung='querthen maincontrol.ActiveTab:=menu2;
      end
      else
      begin

            if (maincontrol.ActiveTab = menu) OR (maincontrol.ActiveTab = menu2) then
            begin
                  if ausrichtung='hochthen maincontrol.ActiveTab:=login;
                  if ausrichtung='querthen maincontrol.ActiveTab:=login2;
            end
            else
            begin
                   MessageDlg('Programm beenden?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbCancel], -1, OnCloseDialog);
            end;
      end;


    end;
    Exit;
  end;

  if Key = sgiUpRightLong then begin // Menu button pressed ?
    if ausrichtung='hochthen maincontrol.ActiveTab:=menu;
    if ausrichtung='querthen maincontrol.ActiveTab:=menu2;
  end;

end;



procedure TForm1.OnCloseDialog(Sender: TObject; const AResult: TModalResult);
begin
  if AResult = mrOK then begin
    Close;
  end;
end;
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#5

AW: Android BackButton..

  Alt 27. Jul 2017, 14:56
Ich weis nicht wie du deine Ausrichtung einstellst, womöglich über die System-Events.
Aber du könntest auch die aktuelle Einstellung abfragen:

Delphi-Quellcode:
function IsPortraitOrientation: Boolean;
var
  FScreenService: IFMXScreenService;
begin
  Result := true;
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, FScreenService) then
    Result := (FScreenService.GetScreenOrientation = TScreenOrientation.Portrait) or
      (FScreenService.GetScreenOrientation = TScreenOrientation.InvertedPortrait);
end;
Rollo
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
461 Beiträge
 
Delphi XE4 Professional
 
#6

AW: Android BackButton..

  Alt 27. Jul 2017, 15:01
Hallo Rollo62

ich hab in OnResize folgendes:

login und login2 sind TabSheets mit angepassten Buttons für den Loginbereich - horizontal/vertikal
menu und menu2 sind TabSheets mit angepassten Buttons für das Hauptmenü - horizontal/vertikal

Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
var
  ScreenService: IFMXScreenService;
begin

  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
  begin
    if ScreenService.GetScreenOrientation in [TScreenOrientation.soPortrait, TScreenOrientation.soInvertedPortrait] then
    Begin
        if maincontrol.ActiveTab=menu2 then maincontrol.ActiveTab:=menu;
        if maincontrol.ActiveTab=login2 then maincontrol.ActiveTab:=login;
        ausrichtung:='hoch';
    End

  else

     begin
        if maincontrol.ActiveTab=menu then maincontrol.ActiveTab:=menu2;
        if maincontrol.ActiveTab=login then maincontrol.ActiveTab:=login2;
        ausrichtung:='quer';
    end;


  end;

end;
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \

Geändert von erich.wanker (27. Jul 2017 um 15:10 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#7

AW: Android BackButton..

  Alt 27. Jul 2017, 15:11
Man muss sich nicht auf OnResize verlassen, da gab es zumindest bei mir mal Probleme mit.
Auf den mobilen Platformen gibt es die Orientation-Events, die funktionieren bisher sehr gut.

Ist nur etwas lästig die immer zuzuordnen ...

Delphi-Quellcode:
procedure TS4View_Manager.OrientationChange_Subscribe;
begin

  // Register the Message handler
  //Subscribe to orientation change events in OnCreate or similar
  //
  FOrientationChangedId := TMessageManager.DefaultManager.SubscribeToMessage(
           TOrientationChangedMessage,
           EvOnOrientationChanged
         );

end;
Delphi-Quellcode:
procedure TS4View_Manager.EvOnOrientationChanged(const Sender: TObject;
   const Msg: TMessage);
var
  cmd : TS4Api_SysEvents;
  screenService : IFMXScreenService;

begin
  cmd := TS4Api_SysEvents.TApi.None;

  //
  // Evaluate the OrientationChange Event first
  //
  if Msg <> nil then
  begin

    if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService,
                                                         screenService) then
    begin

      case screenService.GetScreenOrientation of
        TScreenOrientation.Portrait : cmd := TS4Api_SysEvents.OrientationChange_Portrait;
        TScreenOrientation.Landscape : cmd := TS4Api_SysEvents.OrientationChange_Landscape;
        TScreenOrientation.InvertedPortrait : cmd := TS4Api_SysEvents.OrientationChange_PortraitInv;
        TScreenOrientation.InvertedLandscape: cmd := TS4Api_SysEvents.OrientationChange_LandscapeInv;
      end;

    end;

    screenService := nil; // Release the ServiceIntf

  end;

   .....

end;
Rollo
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
461 Beiträge
 
Delphi XE4 Professional
 
#8

AW: Android BackButton..

  Alt 27. Jul 2017, 15:38
super .. DANKE

Werde ich mir anschauen

LiGrü
Erich
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz