• 0
Grigore

Как я могу скрыть / показать клавиатуру под "Android"?

Вопросы

How i can show/hide virtual keybaord on Android from FireMonkey?

 

Thanks, Grigore

 

Как я могу скрыть/показать клавиатуру под "Android"?

 

Благодарю, Grigore

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 ответ на этот вопрос

  • 0

Русский
За управление виртуальной клавиатурой в FireMonkey отвечает сервис IFMXVirtualKeyboardService (Embarcadero Doc Wiki). Который позволяет отображать и скрывать клавиатуру.
Для скрытия клавиатуры достаточно выполнить следующий код:

uses
  FMX.Platform, FMX.VirtualKeyboard;

procedure TForm5.ButtonHideKeybordClick(Sender: TObject);
var
  KeyboardService: IFMXVirtualKeyboardService;
begin
  // Запрашиваем сервис виртуальной клавиатуры
  if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
    KeyboardService.HideVirtualKeyboard;
end;

Чтобы показать клавиатуру для контрола:

procedure TForm5.ButtonShowKeyboardClick(Sender: TObject);
var
  KeyboardService: IFMXVirtualKeyboardService;
begin
  // Запрашиваем сервис виртуальной клавиатуры
  if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
    KeyboardService.ShowVirtualKeyboard(Edit1);
end;



English 
FireMonkey has special service for managing Virtual Keyboard. It is IFMXVirtualKeyboardService (Embarcadero Doc Wiki). It allows show and hide keyboard.
For showing virtual keyboard use next code:

uses
  FMX.Platform, FMX.VirtualKeyboard;

procedure TForm5.ButtonHideKeybordClick(Sender: TObject);
var
  KeyboardService: IFMXVirtualKeyboardService;
begin
  // Request service of visrtual keyboard
  if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
    KeyboardService.HideVirtualKeyboard;
end;

For showing virtual keyboard for control:

procedure TForm5.ButtonShowKeyboardClick(Sender: TObject);
var
  KeyboardService: IFMXVirtualKeyboardService;
begin
  // Request service of visrtual keyboard
  if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
    KeyboardService.ShowVirtualKeyboard(Edit1);
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.

  • Похожий контент

    • От x11
      На основе нескольких тем форума сделал службу перехвата звонков и номера телефона.
      http://fire-monkey.ru/topic/3878-статьякак-создать-простой-android-broadcast-receiver-how-to-implement-simplest-android-broadcast-receiver-in-delphi/
      http://fire-monkey.ru/topic/2386-перехват-события-звонка/
      http://fire-monkey.ru/topic/2972-использование-нативных-localbroadcastmanager-и-broadcastreceiver/
      Покритикуйте пожалуйста. Уверен, что не всё правильно.
      Но что до ума не удалось довести, так это то, как правильно останавливать службу и закрывать приложение.
      Проект (для Токио) приложил теме.
      Заранее благодарен.
       
      BR2.rar
    • От dim
      Сделал по типу "ScrollableForm". При открытии клавиатуры форма сдвигается, вроде все работает как надо, но если после набора текста нажать на кнопку "Сохранить" то происходит закрытие клавиатуры и смещение кнопки "Сохранить" и соответственно сохранение не происходит и требуется еще раз нажать на кнопку.
      Можно как то это обойти, например сделать задержку закрытия клавиатуры?
    • От M1shQa
      Подкинуло начальство  задачку, да не простую. Приложение должно в фоне мониторить gps, собирать данные о батарее, логировать и потом сливать на сервер. Все это будет нащадно жрать батарею, понимаю, но начальству нужен именно этот вариант. Перейду к вопросам:
      1.Нужно пилить сервис, но исходя из прошлых тем - таймер не работает, слипы не вариант, как сделать так, чтоб сервис просыпался каждые 5 минут/15 минут/ 1 час ?
      2.Мониторинг GPS, тут решение вроде нашел в этой ветке для seattle, как лучше всего собирать и хранить данные для отправки? (до этого все сохранял в простых .txt)
      3.Работают ли компоненты indy корректно в сервисе? срабатывают ли except'ы и как правильно мониторить подключение к сети? 
      Проблема еще и в том, что программа должна работать более менее стабильно и если опыт написания простых приложений у меня есть, то с сервисами уже пару месяцев не могу подружиться..
      Всем бобра!
    • От chaplin.u@gmail.com
      для редактирования  текста в Анроиде вызываю виртуальную клавиатуру как в примере InputQueryMethod 
      выходит клавиатура с буквами и  спецсимволами. как можно вызвать клаву без спецсимволов ? чтобы были только буквы и цифры ?
    • От Rusland
      Проблема давняя, хочется наконец разобраться с ней.
      Вот создал тестовый пример, в котором приложение TestPro и локальный Android-сервис к нему TestService2.
      Запускаю программу, нажимаю кнопку Start Service, сервис стартует (увидеть можно в Настройки -> Приложения -> Работающие).
      Не закрывая программу, перехожу к другим программам и работаю в них. Лучше всего перейти в какой-нибудь браузер и полазить по вкладкам (это довольно ресурсоемкое приложение). 
      После нескольких минут через диспетчер задач я возвращаюсь в свое приложение и оно начинает загружаться с нуля. То есть система давно прибила программу и она начинает загрузку заново. Так вот программа долго висит на заставке, а потом выходит сообщение что приложение не отвечает! Нажимаем OK. После повторного перезапуска программы происходит тоже самое и лишь на третий раз программа запускается.
      Как решить эту проблему?
       
      Я пробовал убивать сервис
      var LIntent: JIntent; LIntent := TJIntent.Create; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString('com.embarcadero.services.TestService2')); TAndroidHelper.Activity.stopService(LIntent); до строчки Application.Initialize - не помогает.
       
      TestService2.zip
    • От web_warp
      Доброго времени суток! Проблема возникла на ровном месте. Простейшее приложение с Edit1, сделанное на C++ Builder 10.1 Berlin.
      В эмуляторе Android 5.0.1 все работает без проблем. На реальном устройстве HTC One E9+ (Android 5.0.2) при тапе на Edit виртуальная клавиатура не появляется и приложение перестает отвечать. Причем на C++ Builder 10 Seattle такой проблемы не возникало. Что может повлиять на появление виртуальной клавиатуры? Могла ли произойти проблема из-за обновления Android-Tools?
       
       
    • От Pax Beach
      Я реализовал пример работы с микрофоном и таймером в Android сервисе, как указано в теме вопроса.
      Каждый раз, когда вы отправляете в сервис StartCommand или сервис перезапускается, включается запись с микрофона, и сохраняется в каталог с музыков в файл "myrecord.3gp".
      Надеюсь, мой пример поможет вам создать новые полезные решения. В этом случае пожалуйста делитесь ими с участниками нашего сообщества.
      Для отладки своих программ на Android используйте запись в LOGI и чтение при помощи monitor.bat (PlatformSDKs\android-sdk-windows\tools).
       
      uses ... AndroidApi.JNI.Media, // JMediaRecorder AndroidApi.Timer, // Timer ...; Const TimerInterval = 1000; TimerCounterSecLimit = 10; type TDM = class(TAndroidService) ... private FTimerHandle: Integer; FRecording: Boolean; procedure StartRecord; procedure StopRecord; procedure StartTimer; procedure StopTimer; public FAudioRec: JMediaRecorder; end; procedure Log(const Fmt: string; const Params: array of const); overload; var Msg: string; M: TMarshaller; begin Msg := Format(Fmt, Params); LOGI(M.AsUtf8(Msg).ToPointer); end; procedure Log(const Source: string); overload; var M: TMarshaller; begin LOGI(M.AsUtf8(Source).ToPointer); end; procedure TDM.AndroidServiceCreate(Sender: TObject); begin FTimerHandle := 0; FTimerCounter := 0; FRecording := false; end; procedure TDM.AndroidServiceDestroy(Sender: TObject); begin StopTimer; StopRecord; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin StopTimer; StopRecord; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service Log('- service stoped', []); end else begin if not FRecording then begin Log('... sound record to be started', []); StartRecord; StartTimer; end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops Log('+ Service started', []); end; end; procedure TDM.StartRecord; begin StopRecord; FAudioRec := TJMediaRecorder.Create; FAudioRec.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC); FAudioRec.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP); FAudioRec.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB); FAudioRec.setOutputFile(StringToJString(TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp'))); try FAudioRec.Prepare(); FAudioRec.start; FRecording := True; Log('+ Start record to %s', [TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp')]); except on E: Exception do Log('- Error in mic recording: %s', [E.Message]); end; end; procedure TDM.StopRecord; begin if Assigned(FAudioRec) then begin if FRecording then begin FRecording := false; try FAudioRec.stop(); FAudioRec.release(); Log('- Mic recording is stoped'); except on E: Exception do Log('- Error in mic stop recording: %s', [E.Message]); end; end; end else begin FRecording := false; end; end; procedure TDM.WaitComplete(TimerId: Integer); begin if FTimerCounter < TimerCounterSecLimit then begin Log('+++ Timer is triggered %d time.', [FTimerCounter]); inc(FTimerCounter); end else StopTimer; end; procedure TDM.StartTimer; begin FTimerCounter := 0; if FTimerHandle = 0 then begin FTimerHandle := AndroidTimerCreate; AndroidTimerSetInterval(FTimerHandle, TimerInterval); end; AndroidTimerSetHandler(WaitComplete); Log('+ Timer started', []); end; procedure TDM.StopTimer; begin if FTimerHandle > 0 then begin Log('... MIC recording to be stopped'); StopRecord; AndroidTimerSetHandler(nil); Log('- Timer stoped', []); end; end; end.  
    • От Rusland
      Пытаюсь из сервиса вывести лог, но в monitor ничего не приходит.
      Для примера вот тестовый проект
      Проверьте, как у вас?
      PS. Из приложения лог приходит нормально
    • От Rusland
      В сервисе сохраняю дату и время вот так:
      var IniFile: TIniFile; SDT: string; FS: TFormatSettings; begin IniFile := TIniFIle.Create(System.IOUtils.TPath.Combine( System.IOUtils.TPath.GetDocumentsPath, 'D.ini')); try FormatSettings.ShortDateFormat:='yyyy-mm-dd'; FormatSettings.DateSeparator := '-'; FormatSettings.LongTimeFormat := 'hh:nn:ss'; FormatSettings.TimeSeparator := ':'; SDT:=DateTimeToStr(Now()); IniFile.WriteString('SERVER','LastOnline',SDT); finally IniFile.free; end; Получаю 31.05.2016 11:08
      Тот же самый код в основном приложении выдает 2016-05-31 11:08
      В чем моя ошибка?
      PS. Что происходит в сервисе дебагером посмотреть не удается, Дельфи просто не реагирует на точки останова
    • От Rusland
      Можно ли работать с одной базой одновременно и из программы и из сервиса?
      PS. Android
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу