Вы можете узнать это, проверив источник классов *KeyListener
, хотя, конечно, это может быть изменено в разных версиях или в настройках производителя или оператора связи. Приведенное ниже основано на исходном коде AOSP 4.3. Это только эффекты, которые каждый тип оказывает на сам Android: методы ввода также используют типы в качестве подсказок, чтобы лучше предсказать, что пользователь может ввести. Например, хотя TYPE_TEXT_VARIATION_PERSON_NAME
имеет эффект только отключения проверки орфографии, IM может реагировать на этот тип автозаполнением из словаря общих имен, а не из языкового словаря.
Чтобы поэкспериментировать с типами ввода и параметрами IME, я взломал быстрое приложение, которое позволяет вам выбирать их из списка в графическом интерфейсе, поэтому вам не нужно редактировать XML-макет и перестраивать приложение для этого. Если вы хотите узнать больше или проверить, как они взаимодействуют с данным приложением для обмена мгновенными сообщениями, загрузите IM Prove бесплатно из Google Play.
TYPE_NULL
Это действительно задокументировано:
Это следует интерпретировать как означающее, что целевое входное соединение не является богатым, оно не может обрабатывать и отображать такие вещи, как текст-кандидат, или извлекать текущий текст, поэтому метод ввода должен будет работать в ограниченном режиме «генерировать ключевые события», если он поддерживает это. Обратите внимание, что некоторые методы ввода могут не поддерживать его, например, метод голосового ввода, скорее всего, не сможет генерировать ключевые события, даже если этот флаг установлен.
Это звучит так, как будто это для случаев, когда вы не редактируете текст, но нажатие клавиши в IM напрямую выполняет какое-то действие. Но на самом деле он полностью скрывает ИМ. С точки зрения приложения, вам это почти никогда не нужно: установите его, если вы хотите, чтобы аппаратная клавиатура могла только вводить текст.
С точки зрения IM, вы будете часто передавать этот тип в onStartInput
, обычно когда Android собирается скрыть IM, потому что на передний план выходит другая активность. Вы хотите, чтобы ответ на этот тип ввода был быстрым. Может быть две причины, почему это работает таким образом, но кто-то, кто занимается дизайном, должен подтвердить, почему:
Это может быть сообщение IM, что редактирование полностью завершено в этом окне (в отличие от onFinishInput
, которое просто означает, что IM скрыто), поэтому он может освободить память, используемую для словарей и тому подобного, до перезапуска редактирования.
Это может быть частью того, что позволяет аппаратной клавиатуре использовать клавиши со стрелками для прокрутки, клавиши быстрого доступа к меню и т. д., даже когда не происходит ввода текста.
Классы
Числовые типы
TYPE_CLASS_NUMBER
дает вам цифры 0-9. Кроме того, добавление TYPE_NUMBER_FLAG_SIGNED
позволяет использовать +
или -
, но только в качестве первого символа. Добавление TYPE_NUMBER_FLAG_DECIMAL
позволяет вам иметь .
в любой позиции, но только один раз. Вы можете использовать как знаковые, так и десятичные числа. Насколько я могу судить, это не локализовано, поэтому разрешенные символы одинаковы даже для локалей, где .
– разделитель тысяч, а ,
– десятичная точка, или для локалей с разными числовыми символами. .
TYPE_CLASS_PHONE
позволяет использовать цифры от 0 до 9, а также любые из #*+-(),/N.;
и пробелов. Вы можете использовать эти символы в любом порядке и любое количество раз: нет проверки форматирования.
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_DATE
позволяет вам иметь цифры 0-9, а также любые из /-.
. Опять же, нет дополнительной проверки форматирования, так что вы можете иметь их в любом порядке.
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_TIME
позволяет вам использовать цифры 0-9, а также :
и любую из amp
(для написания «am» или «pm», но вы можете использовать их в любом порядке и в любом положении). Немного извращенно, у вас не может быть места или . для "15:00" или "14:00" или даже "2.30". Опять же, похоже, что это не локализовано.
TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_NORMAL
дает вам 0-9, а также :/-
, пробел и amp
. В частности, это не включает .
, хотя это разрешено в дате.
Основываясь на приведенных выше наблюдениях, я не могу сказать, что рекомендую использовать какой-либо из вышеперечисленных классов. Все они, кажется, имеют серьезные недостатки и мешают локализации. Выше приведены единственные классы с ограничениями по символам.
TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD
делает то, что вы ожидаете: он использует TransformationMethod
, чтобы скрыть введенные символы.
Типы текста
В TYPE_CLASS_TEXT
установка TYPE_TEXT_VARIATION_EMAIL_ADDRESS
или TYPE_TEXT_VARIATION_EMAIL_SUBJECT
приводит к тому, что нажатие клавиши ввода перемещает фокус на следующее поле вместо вставки новой строки.
TYPE_TEXT_VARIATION_FILTER
предотвратит переход метода ввода в полноэкранный (извлечение) режим.
TYPE_TEXT_VARIATION_PASSWORD
имеет очевидный эффект: он использует TransformationMethod
, чтобы скрыть вводимые символы. TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
по-прежнему использует TransformationMethod
для предотвращения копирования текста
Все следующие варианты текста допускают проверку орфографии, если TYPE_TEXT_FLAG_NO_SUGGESTIONS
не установлено. То есть использование класса, отличного от TYPE_CLASS_TEXT
, или варианта, отсутствующего в этом списке, имеет тот же эффект, что и установка TYPE_TEXT_FLAG_NO_SUGGESTIONS
(описанная ниже).
TYPE_TEXT_VARIATION_NORMAL
TYPE_TEXT_VARIATION_EMAIL_SUBJECT
TYPE_TEXT_VARIATION_LONG_MESSAGE
TYPE_TEXT_VARIATION_SHORT_MESSAGE
TYPE_TEXT_VARIATION_WEB_EDIT_TEXT
Флаги
Наличие или отсутствие InputType.TYPE_TEXT_FLAG_MULTI_LINE
имеет неочевидные побочные эффекты. Если класс типа не TYPE_CLASS_TEXT
, всегда так, как если бы флаг не был установлен, и TextView
переходит в однострочный режим. Установка lines
или maxLines
в 1 влияет только на способ отображения текста: он не запускает однострочный режим.
В однострочном режиме: -
- опция размера эллипса по умолчанию заканчивается
- нажатие ввода выполняет «действие редактора» или перемещает фокус на следующее поле (так же, как для адресов электронной почты или тем, описанных выше); в противном случае он вставляет новую строку
- нажатие табуляции перемещает фокус на следующее поле, только если
TYPE_TEXT_FLAG_IME_MULTI_LINE
не установлено; в противном случае он вставляет символ табуляции
imeOptions
может включать в себя «действие редактора» для замены клавиши ввода на программной клавиатуре; в многострочном режиме TextView
добавит IME_FLAG_NO_ENTER_ACTION
к imeOptions
maxLines
автоматически устанавливается на 1
- добавление новой строки в поле (например, с использованием
setText
) не имеет никакого эффекта, а возврат каретки заменяется пробелом нулевой ширины (U+FEFF)
TYPE_TEXT_FLAG_CAP_*
используйте TextUtils.getCapsMode
, чтобы решить, следует ли использовать заглавные буквы для каждого символа. Правила немного причудливы и не зависят от региональных настроек. AFAICT, это вступает в силу только в том случае, если соответствующий параметр включен на клавиатуре по умолчанию.
Когда установлено TYPE_TEXT_FLAG_AUTO_CORRECT
, пробел, табуляция, новая строка, любой символ «конец пунктуации» Unicode или любой из ,.!?"
вызовет автокоррекцию предыдущего слова (в данном контексте это самая длинная последовательность букв и апострофов Unicode). Если целое слово не имеет исправления, оно продолжает повторяться с более короткими подпоследовательностями. Исправления поступают из фиксированного системного ресурса com.android.internal.R.xml.autotext
и отделены от любой настроенной проверки орфографии.
TYPE_TEXT_FLAG_NO_SUGGESTIONS
(или варианты текста, перечисленные ранее) останавливает проверку правописания текста. Это предотвращает отображение списка вариантов проверки орфографии, а также останавливает выделение слов с ошибками. Метод ввода по-прежнему может обеспечивать завершение, если он выбирает.
Другие странности
Длительное нажатие на TextView
обычно выбирает нажатое слово, но если тип ввода является одним из следующих, вместо этого выделяется весь текст: -
TYPE_CLASS_NUMBER
TYPE_CLASS_PHONE
TYPE_CLASS_DATETIME
(любой вариант)
TYPE_TEXT_VARIATION_URI
TYPE_TEXT_VARIATION_EMAIL_ADDRESS
TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS
TYPE_TEXT_VARIATION_FILTER
person
Dan Hulme
schedule
16.10.2013