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 Réponses :
CallForKeyboard(false,nil)
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
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;
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.
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;
Oui, la propriété killfocusbyreturn fait le travail! allthout vkTab ne déplace pas le focus vers le contrôle suivant
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/...