Firemonkey: Soft Keyboard появляется, когда VKAutoShowMode установлен на Never - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть большое Android-приложение FireMonkey, которое предназначено для использования в основном на сканерах штрих-кодов, но также должно использоваться, например, на телефоне Android (для тестирования).При использовании на устройстве сканера штрих-кода, которое обычно имеет физическую клавиатуру, мы подавляем виртуальную клавиатуру, устанавливая VKAutoShowMode в TVKAutoShowMode.Never.

Это прекрасно работает для большинства компонентов Tedit.Однако для 1 или 2 из них, которые, по сути, "совпадают" с другими, виртуальная клавиатура появляется при получении нажатия клавиши с физической клавиатуры.И, кроме того, его нелегко отклонить, используя клавишу возврата с установленным параметром KillFocusByReturn на соответствующем Tedit.

Я могу обойти проблему, используя язык Android и настройки ввода, чтобы полностью отключить виртуальную клавиатуру, но этоэто менее чем идеально, так как в некоторых областях нам нужна программная клавиатура для более простого альфа-ввода.

Я также могу добиться частичного обходного пути, вызвав нашу подпрограмму «HideVirtualKeyboard» в событии onkeyup для проблемы Tedit (s).), но это выглядит глупо, поскольку клавиатура мигает, а затем исчезает.Кроме того, если один из них переместится на другой TTabItem в приложении после того, как уделит внимание проблеме Tedit, нажатие клавиши на физической клавиатуре раскроет виртуальную клавиатуру, и для ее устранения потребуется принять специальные меры.

Буду признателен за любые предложения.

1 Ответ

0 голосов
/ 05 апреля 2019

Я выполнил несколько проектов с использованием считывателей RFID, и я сам взял управление клавиатурой там, где мне было нужно. Вот тот же код из одного из моих проектов:

else if TabControl1.ActiveTab = tsRFID then
  begin
    {$ifdef NORFIDTYPING}
    VKAutoShowMode := TVKAutoShowMode.Never; // hide virtual keyboard
    {$endif}

Следует отметить, что следующий код не всегда говорит правду:

function TfrmAppMain.KeyBoardVisible: Boolean;
var
  FService : IFMXVirtualKeyboardService;
begin
  Result := False;
  TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
  if (FService <> nil) and (TVirtualKeyboardState.Visible in FService.VirtualKeyBoardState) then
    Result := True;
end;
...