Перейти к содержанию
Fire Monkey от А до Я
  • 0

Нестандартная клавиатура для своего приложения


kami

Вопрос

Доброго времени суток!

Есть необходимость для некоторых TEdit вызывать "собственную" клавиатуру (конкретизирую - исключительно с цифрами, кнопкой Backspase, знаком "-" и Enter. Приложение будет для iPad, а там (к сожалению) клавиатура Numbers&Punctuation не отличается от NumbersOnly).

 

Самостоятельно я "докопался" до того, что подобное в теории возможно при использовании TEdit.ControlType = Platform, тогда в Edit.PresentationProxy.NativeObject будет лежать UITextField и можно ему присвоить "левый" UIView. Тогда, судя по документации Apple https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextField_Class/index.html#//apple_ref/occ/instp/UITextField/inputView этот "левый" UIView будет вызываться вместо стандартной клавиатуры.

 

К сожалению, для Edit.ControlType = Styled нативный контрол не создается, что сводит на нет все мои поиски, т.к. нужны именно стилизованные компоненты :(

 

Вторая потенциальная возможность, которую я рассматривал - узнать, где и как "глобально" вызывается клавиатура и подменить параметры вызова на свои. Но... во внутренностях всяких вызовов при получении элементом фокуса ввода я, если честно, запутался. Там много всего фигурирует, начиная от TCustomEditModel, заканчивая TFMXViewBase в TTextServiceCocoa.EnterControl. И непонятно, где же собственно вызов самой клавиатуры :)

 

Есть ли возможность (хотя бы направление) заменить стандартную клавиатуру на собственную, желательно - с сохранением при этом событий OnKeyboardShow / Hide и с использованием стилизованных компонентов ?

 

Конфигурация: Delphi XE7 upd1, iPad, iOS 8.2

Изменено пользователем kami
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Что вы подразумеваете под "нарисуйте свою"? Создать фрейм с кнопками? Да, это несложно.

А как сделать так, чтобы при получении Edit-ом фокуса ввода показывалась не системная клавиатура (которая идет поверх всего приложения), а именно эта? И чтобы код, который скроллит контекст формы так, чтобы элемент с фокусом ввода не скрывался клавиатурой, а оставался видимым отрабатывал одинаково и для системной клавиатуры и для своей? И чтобы символы вставлялись/удалялись именно в положение курсора, который пользователь может переместить в любое место?

 

Да, можно сделать Edit1.ReadOnly:=True, это позволит показать курсор и не вызовет клавиатуру. Да, на OnEnter/OnExit каждого из нужных Edit-ов можно повесить показ/скрытие своей клавиатуры. Да, можно в код формы, отвечающий за "оставание на экране" элемента с фокусом внести изменения по этой клавиатуре (правда, для этого фрейм клавиатуры придется делать глобальной переменной). Можно и закостылироваться со вставкой нужного символа в нужное положение. Но что-то слишком много получается "да, можно" и при этом решение будет не универсальным и зависящим от человеческого фактора. Кто поручится, что завтра не понадобится обрабатывать OnKeyDown/OnKeyUp и иже с ними? Или я забуду выставить ReadOnly для TEdit? И я уверен, что это не все вопросы, которые надо будет решить - при реализации вот такого велосипеда появится еще куча... Ну и- код по работе с клавиатурой получается размазанным по разным модулям, а это уже очень плохо. Да и приложение все же не будет считать этот велосипед за клавиатуру, а так - будет "закрывать глаза" на все несоответствия.

 

Все-таки, мне кажется, должно быть какое-то "общее" решение, которое позволит обойти озвученные вопросы изящно и непринужденно :)

Ссылка на комментарий
  • 0
  • Администраторы

У нативного TEdit (ControlType = Platform) под iOS есть прозрачный стиль. Стиль без фона и рамки. Для его использования нужно прописать ручками стиль:

Edit1.StyleLookup = TransparentEditStyle

После этого, нативный эдит будет прозрачный. А значит вы можете под него сделать стилизованную подложку, чтобы ваш нативный эдит не выбивался из стилистики.

Ссылка на комментарий
  • 0

Господа, спасибо за участие в обсуждении!

 

Принимая во внимание кучу параметров, я "заморочился" на написание собственной клавиатуры. Проанализировав и продебажив кучу кода FMX, удалось подменить стандартную клавиатуру собственной.

 

На текущий момент концепт готов и работает, но обладает одним недостатком - из-за особенностей работы процедуры RegisterShowVKProc стандартный вызов клавиатуры теряется без возможности восстановления.

Посему - я буду реализовывать нужные мне виды + повторять стандартные Ru и Eng, возможно - с некоторыми изменениями.

 

Концепт предназначен для работы только под iOS.

 

Использование: подключаете к проекту модуль из архива... и всё. Кастомная клавиатура теперь будет показываться вместо стандартной во всех контролах, в которых вообще показывается клавиатура.

 

Известные недостатки:

1. Нет анимации появления/скрытия.

2. Не реализовано нажатие кнопки Return (пока не думал, как это делается)

3. Не реагирует на флаги TVirtualKeyboardStates

4. Не уверен в корректном удалении фрейма при завершении приложения.

5. Нет тулбара (не уверен, правда, что он нужен в собственной клавиатуре)

 

Если необходимо - готов дать пояснения по коду.

Ввиду того, что я только начинаю работать с FMX, любая критика приветствуется!

iOSCustomKeyboard.zip

Изменено пользователем kami
Ссылка на комментарий
  • 1

Раз уж пошла такая пьянка - выложу сюда то, что по виртуальной клавиатуре есть у меня на текущий момент (в телеграме уже выложил).

Поддерживаются операционные системы: iOS, Windows. Оттестировано на 10.1 (Berlin)

Итак: архив распаковать куда угодно, в проект в uses подключить модули uCommonCustomKeyboard (отвечает за подмену "штатной виртуальной клавиатуры" на свою) и ufrCustomNumpad (отвечает за отображение цифровой клавиатуры).

Алфавитную, e-mail-овскую и тому подобные виды клавиатур оставляю на ваше усмотрение. Они делаются на основе ufrCustomNumpad, там больше заморочек с красивым размещением кнопок, чем с кодом.

CustomKeyboards.7z

Изменено пользователем kami
Ссылка на комментарий
  • 0
В 05.12.2016 в 17:54, Rusland сказал:

как сделать чтобы на разные Edit открывались разные клавиатуры

Слегка запоздалый ответ, но... Выставляешь нужные keyboardtype полям ввода ... и всё. Если нужно анализировать какие-то другие поля - в моей клаве есть метод GetKeyboardTypeForObject, в котором можно провести нужные (не предусмотренные штатным механизмом) манипуляции

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

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