2
votes

Masquer le clavier virtuel dans l'application Android avec Delphi 10.3

J'ai trouvé de nombreuses références à ce problème, mais je n'ai pas encore trouvé de solution.

J'utilise le code suivant pour masquer le clavier virtuel, mais cela ne fonctionne pas.

FService: IFMXVirtualKeyboardService;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
  if FService = nil then ShowMessage('xxxxx');
end;
.....
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  //ShowMessage(IntToStr(Key) + '~' + KeyChar + '~');
  //Application.ProcessMessages;
  if (Key = vkHardwareBack) then
  begin
    // this code is executed
    Application.Terminate;
    Key := 0;
  end
  else
  if Key in [vkRETURN, vkACCEPT] then begin
    // this code never executed
    if (FService <> nil) then begin // FService isn't nil
      FService.HideVirtualKeyboard;
    end;
  end;
end;


3 commentaires

Je pense que vous devriez utiliser FormKeyPress pour vkReturn


Il n'y a pas un tel événement dans FMX. Uniquement KeyDown / KeyUp.


Désolé, consultez ce message: stackoverflow.com/questions/42633640/...


3 Réponses :


0
votes
CallForKeyboard(false,nil)

3 commentaires

Je n'ai pas besoin d'une fonction pour ouvrir le clavier car il s'ouvre automatiquement lorsque je touche dans la zone d'édition. Pour la fermeture, j'utilise déjà la procédure HideVirtualKeyboard. Mais le problème est d'intercepter la touche ENTER / ACCEPT


@JimPapas Avez-vous essayé de n'avoir d'autre si (Key = vkReturn) alors ...?


Oui. C'était ma première approche mais après son échec, j'ai ajouté le "vkACCEPT" car le clavier a une touche de contrôle au lieu de "RETURN". Notez que ce code fonctionnait dans D10.1



0
votes

Utilisez le gestionnaire d'événements FormkeyUp :

procedure TfrmAppMain.FormTouch(Sender: TObject; const Touches: TTouches;
  const Action: TTouchAction);
begin
  FBackPressed := False; // as soon as they touch the form, the exit flag is reset
end;

Ce code émule également la fonctionnalité "Appuyez à nouveau pour quitter" que vous voyez dans de nombreuses applications Android. Pour que cela fonctionne correctement, vous devez également faire ceci:

procedure TfrmAppMain.FormKeyUp(Sender: TObject; var Key: Word;
  var KeyChar: Char; Shift: TShiftState);
begin
  {$ifdef ANDROID}
  if Key = vkHardwareBack then
  begin
    if FKeyBoardShown or KeyBoardVisible then // it lies
    begin
      // allow default behaviour - which hides the keyboard
      // note: keyboardvisible also returns true on readonly fields
      if (Self.Focused is TEdit) and TEdit(Self.Focused).ReadOnly then
      begin
        FToast.MakeToast('Press again to exit');
        FBackPressed := True;
      end;
    end
    else
    begin
      Key := 0; // NOTE: intercept default behaviour (which is to close the app)
      if FBackPressed then
      begin
        SaveDataandClose; // which then calls Self.Close later
      end
      else
      begin
        FToast.MakeToast('Press again to exit');
        FBackPressed := True;
      end
    end;
  end;
  {$endif}
end;


2 commentaires

Mon objectif est d'intercepter la touche RETURN ou ACCEPT, pas seulement pour fermer le clavier, par exemple. l'utilisateur écrit un nombre ou un texte et à la fin appuie sur la touche retour / acceptation pour informer l'application qu'il / elle a terminé et souhaite fermer le clavier pour continuer avec d'autres modifications.


Sur chaque contrôle pertinent, définissez la propriété .killfocusbyreturn . Alors voyez mon autre réponse ci-dessous.



1
votes

Il s'agit du code de mes applications Android qui fonctionnait entre 10.0 et 10.3.1

procedure TfrmAppMain.FormKeyDown(Sender: TObject; var Key: Word;
  var KeyChar: Char; Shift: TShiftState);
begin
  {$ifdef ANDROID}
  // make enter like tab which shifts focus to the next control
  // and may cause the keyboard to disappear and reappear in quick succession
  // depending on the .killfocusbyreturn property of the current control
  if Key = vkReturn then
  begin
    Key := vkTab;
    KeyDown(Key, KeyChar, Shift);
  end;
  {$endif}
end;


1 commentaires

Oui, la propriété killfocusbyreturn fait le travail! allthout vkTab ne déplace pas le focus vers le contrôle suivant