- Клавиатура и аппаратные кнопки
- Аппаратные и клавиатурные клавиши
- Кнопка Back: Вы уверены, что хотите выйти из программы?
- Двойное нажатие на кнопку Back
- Кнопка Home
- Обработка кнопки Menu
- Другие кнопки
- Прячем клавиатуру
- Изменить вид клавиатуры для EditText
- Переопределяем кнопку Enter
- Интерфейс OnKeyListener
- Сдвигаем активность
- Узнать выбранный язык на клавиатуре
- Русские Блоги
- WindowSoftInputMode анализ программной клавиатуры Android
- Укажите windowSoftInputMode для действия
- adjustPan
- adjustResize
- adjustNothing
- Русские Блоги
- Проблемы, связанные с программной клавиатурой Android
- 1. Использование свойства windowSoftInputMode
- 1. stateUnspecified
- 2. stateUnspecified
- 3. stateHidden
- 4. stateAlwaysHidden
- 5. stateVisible
- 6. stateAlwaysVisible
- 7. adjustResize,adjustPan
- 8. adjustUnspecified
- 2. Откройте и закройте мягкую клавиатуру.
- 3. Следите за открытием и закрытием мягкой клавиатуры.
- 3.1 Обычные методы
- 3.2 Перепишите onMeasure корневого макета
Клавиатура и аппаратные кнопки
Аппаратные и клавиатурные клавиши
Обработка аппаратных клавиш и клавиатуры имеет следующие методы
- onKeyDown() — вызывается при нажатии любой аппаратной клавиши;
- onKeyUp() — вызывается при отпускании любой аппаратной клавиши;
Кроме клавиш, есть ещё другие методы обработки пользовательского ввода (здесь не рассматриваются):
- onTrackballEvent() — срабатывает при движениях трекбола;
- onTouchEvent() — обработчик событий сенсорного экрана, срабатывает при касании, убирания пальца и при перетаскивании.
Чтобы ваши компоненты и активности реагировали на нажатия клавиш, переопределите обработчики событий onKeyUp() и onKeyDown():
Параметр keyCode содержит код клавиши, которая была нажата; сравнивайте его со статическими кодами клавиш, хранящимися в классе KeyEvent, чтобы выполнять соответствующую обработку.
Параметр KeyEvent также включает в себя несколько методов: isAltPressed(), isShiftPressed() и isSymPressed(), определяющих, были ли нажаты функциональные клавиши, такие как Alt, Shift или Sym. Статический метод isModifierKey() принимает keyCode и определяет, является ли нажатая клавиша модификатором.
Кнопка Back: Вы уверены, что хотите выйти из программы?
Кнопка Back (Назад) закрывает приложение, точнее текущую активность, но если приложение состоит из одной активности, то это равносильно закрытию всего приложения. В большинстве случаев вам нет никакого дела до неуклюжего пользователя, который по ошибке нажал на кнопку «Back» вместо кнопки Подарить разработчику миллион. Но, если ваша программа, будучи запущенной на телефоне пользователя, потихоньку списывает деньги клиента в счёт Фонда голодных котов, то нужно дать ему шанс задуматься и вывести диалоговое окно с вопросом: «А действительно ли вы хотите выйти из программы?»
Чтобы реализовать такую задачу, нужно переопределить поведение кнопки «Back» через метод активности onBackPressed() следующим образом:
Данный метод появился в Android 2.0. Для более ранних версий использовался стандартный код обработки onKeyDown():
Двойное нажатие на кнопку Back
Другой вариант — выход из приложения при двойном нажатии на кнопку «Back». Удобно в тех случаях, когда считаете, что пользователь может случайно нажать на кнопку, например, во время активной игры. Приложение закроется, если пользователь дважды нажмёт на кнопку в течение двух секунд.
Кнопка Home
Можно отследить нажатие кнопки Home через метод активности onUserLeaveHint():
Обработка кнопки Menu
У телефона, кроме кнопки «Back», есть ещё кнопка «Menu» для вызова команд меню (на старых устройствах). Если необходимо обрабатывать нажатия этой кнопки (например, управление в игре), то используйте следующий код (обычное и долгое нажатие):
Должен заметить, что длинное нажатие трудно уловить, так как обычное нажатие постоянно подавляет это событие.
Другие кнопки
Ну на самом деле можно отслеживать не только нажатие кнопки Меню, но и кнопку Поиска и кнопки увеличения громкости.
Обратите внимание, что для кнопки громкости возвращаем false, т.е. мы не переопределяем поведение кнопки, а оставляем её на усмотрение системы.
Пример работы с кнопками громкости можно посмотреть в статье Рингтоны. Управление громкостью
По такому же принципу работает метод onKeyUp(). Метод onKeyLongPress() можно использовать, если в методе onKeyDown() был задействован метод event.startTracking(), отслеживающий поведение кнопки. В нашем примере мы отслеживали кнопку Volume_Up.
Прячем клавиатуру
Бывает так, что при запуске активности сразу выскакивает клавиатура. Если такое поведение не нравится, то пропишите в манифесте нужное значение у атрибута android:windowSoftInputMode (см. ниже).
В некоторых случаях хочется убрать клавиатуру с экрана, не нажимая кнопку «Back», а программно. В одном моём приложении, где было много текстовых полей, я воспользовался следующим кодом при щелчке кнопки:
Код так выглядит, если писать его в Activity. Если расположить его в другом классе, экземпляр Activity нужно передать туда как параметр и вызывать методы как activity.getApplicationContext(), где activity — экземпляр Activity.
Можно избавить компонент от фокуса:
Чтобы принудительно показать клавиатуру, используйте следующий код:
Кстати, повторный вызов метода закроет клавиатуру. Указанный способ не требует наличия элементов View.
Если продолжить тему показа клавиатуры, то может возникнуть следующая ситуация. Допустим у вас есть DialogFragment с EditText. При выводе диалогового окна вам нужно установить фокус на EditText и показать клавиатуру:
Либо используйте тег для нужного EditText.
Изменить вид клавиатуры для EditText
Когда элемент EditText получает фокус, то появляется клавиатура. Можно установить нужный вид клавиатуры через атрибут InputType или программно через метод setInputType():
TYPE_CLASS_DATETIME — дата и время
TYPE_CLASS_NUMBER — цифры
TYPE_CLASS_TEXT — буквы
Переопределяем кнопку Enter
Кроме атрибута InputType можно также использовать атрибут android:imeOptions в компоненте EditText, который позволяет заменить кнопку Enter на клавиатуре на другие кнопки, например, Next, Go, Search и др. Возможны следующие значения:
- actionUnspecified: Используется по умолчанию. Система сама выбирает нужный вид кнопки (IME_NULL)
- actionGo: Выводит надпись Go. Действует как клавиша Enter при наборе адреса в адресной строке браузера (IME_ACTION_GO)
- actionSearch: Выводит значок поиска (IME_ACTION_SEARCH)
- actionSend: Выводит надпись Send (IME_ACTION_SEND)
- actionNext: Выводит надпись Next (IME_ACTION_NEXT)
- actionDone: Выводи надпись Done (IME_ACTION_DONE)
Чтобы увидеть все варианты воочию, можете создать несколько текстовых полей и переключаться между ними:
Чтобы реагировать на нажатия разных состояний кнопки Enter, необходимо реализовать интерфейс TextView.OnEditorActionListener. Небольшой пример:
В нашем примере если пользователь ищет что-то, не связанное с котом, то кнопка поиска не будет выполнять желание владельца устройства.
Также можно поменять текст на кнопке с помощью атрибута android:imeActionLabel:
Текст на кнопке поменялся, но вот обработка Enter из предыдущего примера у меня перестала работать. Мой неработающий код на память.
Upd: Читатель Максим Г. предложил следующее решение проблемы. Убираем атрибуты imeOptions, imeActionId, imeActionLabel и установим их программно.
По желанию можете отслеживать только у нужного поля. Поставьте дополнительное условие после первого блока if:
Интерфейс OnKeyListener
Чтобы среагировать на нажатие клавиши внутри существующего представления из активности, реализуйте интерфейс OnKeyListener и назначьте его для объекта View, используя метод setOnKeyListener(). Вместо того, чтобы реализовывать отдельные методы для событий нажатия и отпускания клавиш, OnKeyListener использует единое событие onKey().
Используйте параметр keyCode для получения клавиши, которая была нажата. Параметр KeyEvent нужен для распознавания типа события (нажатие представлено константой ACTION_DOWN, а отпускание — ACTION_UP).
Сдвигаем активность
Чтобы всплывающая клавиатура не заслоняла элемент интерфейса, который получил фокус, а сдвигала активность вверх, можно в манифесте для нужной активности прописать атрибут android:windowSoftInputMode с параметром adjustPan:
Также доступны и другие параметры:
- stateUnspecified — настройка по умолчанию. Система сама выбирает подходящее поведение клавиатуры.
- stateUnchanged — клавиатура сохраняет своё последнее состояние (видимое или невидимое), когда активность с текстовым полем получает фокус.
- stateHidden — клавиатура скрыта, когда открывается активность. Клавиатура появится при наборе текста. Если пользователь переключится на другую активность, то клавиатура будут скрыта, но при возвращении назад клавиатура останется на экране, если она была видима при закрытии активности.
- stateAlwaysHidden — клавиатура всегда скрывается, если активность получает фокус.
- stateVisible — клавиатура видима.
- stateAlwaysVisible — клавиатура становится видимой, когда пользователь открывает активность.
- adjustResize — размеры компонентов в окне активности могут изменяться, чтобы освободить место для экранной клавиатуры.
- adjustPan — окно активности и его компоненты не изменяются, а сдвигаются таким образом, чтобы текстовое поле с фокусом не было закрыто клавиатурой.
- adjustUnspecified — настройка по умолчанию. Система сама выбирает нужный режим.
Параметры с префиксом state можно комбинировать с настройками с префиксом adjust:
Например, чтобы показать клавиатуру при старте активности, используйте stateVisible.
Данные настройки доступны и программно. Например, код для adjustResize:
Кстати, этот код не сработает в полноэкранном режиме (флаг FLAG_FULLSCREEN). Сверяйтесь с документацией.
Узнать выбранный язык на клавиатуре
Для определения текущего языка на клавиатуре можно использовать следующий код.
Следует быть осторожным с примером. На эмуляторе с Android 6.0 пример работал корректно. На реальных устройствах у меня корректно определялся русский язык, но при переключении на английский язык выдавал пустую строку или значение «zz». В этом случае можно прибегнуть к условиям if и проверять ожидаемое значение.
Источник
Русские Блоги
WindowSoftInputMode анализ программной клавиатуры Android
Всплывающая программная клавиатура Android может скрыть EditText или другие элементы управления на интерфейсе, а иногда возникают некоторые необъяснимые проблемы. Чтобы решить проблему с программной клавиатурой, начните с windowSoftInputMode. Обычно используются windowSoftInputMode: AdjustPan, AdjustResize, AdjustNothing и т. д. Эта статья только изучает эти атрибуты, другие могут сделать это самостоятельно.
Укажите windowSoftInputMode для действия
Это очень просто и может быть указано в AndroidManifest.xml или в коде Java.
Используйте в XML
Используйте в Java
Далее проанализируйте некоторые атрибуты, обычно используемые в windowSoftInputMode.
adjustPan
Окно Activity (DecorView) не изменяется в размере. Когда EditText, который получает фокус, находится в нижней части экрана, когда программная клавиатура всплывает и блокирует EditText, весь DecorView будет перемещаться вверх. Неясно, сколько двигаться вверх.
обычно перемещается вверх до тех пор, пока EditText не будет заблокирован программной клавиатурой. Это свойство используется чаще и часто используется вместе с ScrollView.
adjustResize
Как следует из названия, этот режим автоматически изменяет размеры. При наблюдении через иерархическое представление размер самого decorView не изменяется, но наша область содержимого contentView (id = android.R.content) будет соответственно уменьшаться, чтобы освободить место для отображения клавиатуры. Ниже contentView — пустая область, и программная клавиатура покрывает эту область.
Примечание: AdjustResize просто регулирует размер contentView, так что все еще можно перезаписать EditText.
Наиболее полезная вещь в AdjustResize — это то, что этот режим может легко получить высоту программной клавиатуры. Разница между изменением высоты contentView после того, как программная клавиатура появляется, — это высота программной клавиатуры.
Кроме того: в этом режиме могут возникнуть проблемы, и экран исчезнет, когда клавиатура исчезнет, что немного неудобно. Причина в том, что когда клавиатура всплывает, позиция клавиатуры отображает windowBackground. Если windowBackground черный, а фон деятельности белый, он будет мерцать, когда клавиатура исчезнет. Решением является добавление свойства android: windowBackground в тему Activity для изменения фона окон.
adjustNothing
В этом режиме окно «Активность» не вносит никаких изменений, и размер contentView не изменяется.
Источник
Русские Блоги
Проблемы, связанные с программной клавиатурой Android
1. Использование свойства windowSoftInputMode
Android использует windowSoftInputMode для управления взаимодействием между главным окном Activity и окном, содержащим экранную виртуальную клавиатуру. Установка этого атрибута влияет на два аспекта:
- Состояние виртуальной клавиатуры, когда Activity становится фокусом внимания пользователя — скрыто или видимо.
- Корректировки, внесенные в главное окно Activity — уменьшить ли его размер, чтобы освободить место для виртуальной клавиатуры, или нужно ли преобразовать его содержимое, чтобы сделать текущий фокус видимым, когда окно частично закрыто виртуальной клавиатурой.
Параметр должен быть одним из значений, перечисленных в таблице ниже, или сочетанием значения «состояние . » и значения «настроить . ». Установка нескольких значений в любой группе (например, нескольких значений «состояние . ») приведет к неопределенным результатам. Используйте вертикальные полосы (|) для разделения значений. Например:
Установленное здесь значение (кроме «stateUnspecified» и «adjustUnspecified») заменяет значение, установленное в теме.
значение | Описание |
---|---|
«stateUnspecified» | Не указывает состояние программной клавиатуры (скрытая или видимая). Система выберет соответствующее состояние или будет полагаться на настройки в теме. Это настройка по умолчанию для поведения программной клавиатуры. |
“stateUnchanged” | Когда Activity переходит на передний план, сохраняется последнее состояние виртуальной клавиатуры, независимо от того, является ли оно видимым или скрытым. |
“stateHidden” | Когда пользователь выбирает Activity, то есть когда пользователь действительно переходит к Activity, а не выходит из другого Activity, программная клавиатура скрывается. |
“stateAlwaysHidden” | Когда основное окно Activity имеет фокус ввода, виртуальная клавиатура всегда скрыта. |
“stateVisible” | Показывать виртуальную клавиатуру в нормальных условиях (когда пользователь переходит к главному окну Activity). |
“stateAlwaysVisible” | Когда пользователь выбирает действие, то есть когда пользователь действительно переходит к действию, вместо того, чтобы вернуться из другого действия, отображается экранная клавиатура. |
“adjustUnspecified” | Он не указывает, изменяется ли размер главного окна Activity, чтобы освободить место для виртуальной клавиатуры, или панорамируется ли содержимое окна, чтобы показать текущий фокус на экране. Система автоматически выберет один из этих режимов в зависимости от того, есть ли какие-либо виды макета, которые могут прокручивать содержимое окна. Если такой вид есть, размер окна будет изменен при условии, что все содержимое окна можно увидеть в меньшей области при прокрутке. Это настройка по умолчанию для поведения главного окна. |
“adjustResize” | Всегда регулируйте размер главного окна Activity, чтобы освободить место для виртуальной клавиатуры на экране. |
“adjustPan” | Размер главного окна Activity не регулируется, чтобы освободить место для мягкой клавиатуры, но содержимое окна автоматически переводится, так что текущий фокус никогда не перекрывается клавиатурой, так что пользователь всегда может видеть содержимое своего ввода. Обычно это не так желательно, как изменение размера, поскольку пользователю может потребоваться закрыть программную клавиатуру, чтобы дотянуться до закрытых частей окна или взаимодействовать с ними. |
Системное значение по умолчанию: stateUnspecified | adjustUnspecified
Выше приведено описание цитирования официального документа Android, но это не позволяет нам понять весь контент. Итак, на этот раз мы специально исследуем, как влияют эти 9 атрибутов.
1. stateUnspecified
Официальное описание android: не указывать состояние виртуальной клавиатуры (скрыто или видно). Система выберет соответствующее состояние или будет полагаться на настройки в теме. Это настройка по умолчанию для поведения программной клавиатуры. Какая система считает подходящим состояние?
Мы используем следующий макет
Мы обнаружили, что программная клавиатура не появляется автоматически, а клавиатура появляется после нажатия EditText вручную.
Если вы используете следующий макет
Мы обнаружили, что программная клавиатура появляется автоматически. Это очень странно, зачем добавлять ScrollView, это потому, что ScrollView добавлен, мягкая клавиатура может автоматически всплывать? Давайте посмотрим на следующий макет
Запустите код, чтобы обнаружить, что программная клавиатура не появляется автоматически. Это показывает, что автоматическое всплывающее окно виртуальной клавиатуры не имеет прямого отношения к ScrollView.
Если мы будем использовать следующую раскладку, мы обнаружим, что программная клавиатура все равно будет всплывать автоматически.
Как по-прежнему использовать макет выше, но мы добавляем следующий код в onCreate
Мы обнаружили, что программная клавиатура не появляется автоматически.
Теперь подведем итоги: когда для свойства установлено значение stateUnspecified, система не будет автоматически отображать программную клавиатуру по умолчанию, но при наличии требования прокрутки в интерфейсе (ListView или ScrollView и т. Д.) И в поле ввода с фокусом автоматически появится программная клавиатура. (Если фокус находится не в поле ввода, программная клавиатура не появится автоматически).
2. stateUnspecified
Это относительно просто: всплывает ли программная клавиатура при входе в текущий интерфейс, определяется предыдущим интерфейсом. Если вы оставите предыдущий интерфейс и клавиатура будет открытой, клавиатура в этом интерфейсе будет открыта; в противном случае она будет закрыта.
3. stateHidden
Это также относительно просто: при входе в текущий интерфейс, независимо от текущего предыдущего интерфейса или текущего интерфейса, программная клавиатура по умолчанию не отображается.
4. stateAlwaysHidden
Разница между этим параметром и stateHidden заключается в том, что когда мы переходим к следующему интерфейсу, если отображается программная клавиатура следующей страницы, и когда мы возвращаемся снова, программная клавиатура будет скрыта. И установите stateHidden, когда мы вернемся снова, будет отображаться мягкая клавиатура.
5. stateVisible
Установите это свойство, независимо от того, требуется ли в интерфейсе всплывающая программная клавиатура при входе в этот интерфейс, программная клавиатура будет отображаться.
6. stateAlwaysVisible
Разница между этим параметром и stateAlwaysVisible заключается в том, что когда мы переходим с этого интерфейса на следующий интерфейс и возвращаемся к этому интерфейсу со следующего интерфейса, программная клавиатура исчезнет. Когда мы вернемся к этому интерфейсу, программная клавиатура все еще может всплывать и отображаться, а stateVisible — нет. встреча.
Приведенные выше 6 атрибутов определяют, отображается ли программная клавиатура при входе в интерфейс. Следующие 3 атрибута устанавливают отношение отображения между виртуальной клавиатурой и содержимым отображения интерфейса.
7. adjustResize,adjustPan
Мы обсудим эти два свойства вместе. Чтобы проиллюстрировать эту проблему, давайте сначала посмотрим на следующий пример макета
adjustResize
adjustPan
Из двух приведенных выше изображений мы можем узнать, что если установлен атрибут adjustResize, когда отображается клавиатура, размер главного окна интерфейса регулируется (сжатие и т. Д.) Для достижения размера мягкой клавиатуры; если атрибут adjustPan установлен, когда отображается клавиатура , Путем перемещения макета интерфейса, чтобы обеспечить отображение поля ввода.
8. adjustUnspecified
Это свойство определяет, использует ли интерфейс adjustResize или adjustPan для отображения виртуальной клавиатуры в зависимости от того, есть ли в интерфейсе прокручиваемые элементы управления. Если есть прокручиваемый элемент управления, его можно понимать как adjustResize, который достигается за счет сжатия интерфейса.Но есть предпосылка: все содержимое окна можно увидеть в меньшей области с помощью прокрутки. Если нет прокручиваемых элементов управления или предварительные требования не выполняются, используются adjustPan и мобильный макет.
2. Откройте и закройте мягкую клавиатуру.
Открытие и закрытие виртуальной клавиатуры в основном осуществляется через InputMethodManager. InputMethodManager имеет следующие методы для открытия и закрытия виртуальной клавиатуры.
метод | Описание |
---|---|
hideSoftInputFromInputMethod(IBinder token, int flags) | Закройте / скройте программную клавиатуру, чтобы пользователь не мог видеть программную клавиатуру, но переданный токен должен быть токеном в системе. |
hideSoftInputFromWindow(IBinder windowToken, int flags) | То же, что и метод hideSoftInputFromWindow ниже, за исключением того, что значение, переданное с помощью resultReceiver, равно null |
hideSoftInputFromWindow(IBinder windowToken, int flags, ResultReceiver resultReceiver) | Закройте / скройте мягкую клавиатуру, отличие от первого метода в том, что переданный им токен является токеном окна просмотра в интерфейсе системы. |
showSoftInput(View view, int flags, ResultReceiver resultReceiver) | Соответствует hideSoftInputFromWindow |
showSoftInput(View view, int flags) | То же, что и указанный выше метод, но по умолчанию resultReceiver имеет значение null |
showSoftInputFromInputMethod(IBinder token, int flags) | Соответствует hideSoftInputFromInputMethod |
toggleSoftInput(int showFlags, int hideFlags) | Этот метод заключается в переключении программной клавиатуры, если программная клавиатура открыта, вызовите этот метод, чтобы закрыть программную клавиатуру; в противном случае, если программная клавиатура закрыта, откройте |
toggleSoftInputFromWindow(IBinder windowToken, int showFlags, int hideFlags) | То же, что и вышеупомянутый метод, разница в токене текущего представления, переданного в |
В приведенном выше методе мы видим, что необходимо передать соответствующие флаги. Соответствующие флаги следующие.
Параметры | Описание
——————-|—
HIDE_IMPLICIT_ONLY | Указывает, что программная клавиатура скрыта только тогда, когда пользователь не отображает ее явно
HIDE_NOT_ALWAYS | Указывает, что виртуальная клавиатура будет равномерно скрыта и будет отображаться, если не будет вызвана SHOW_FORCED
SHOW_FORCED | Указывает, что принудительное отображение виртуальной клавиатуры не будет закрыто, если пользователь явно не захочет его закрыть
SHOW_IMPLICIT | Указывает, что программная клавиатура получила неоднозначный запрос на отображение.
Способ закрытия программной клавиатуры:
Метод открытия ключевого диска:
3. Следите за открытием и закрытием мягкой клавиатуры.
3.1 Обычные методы
Наиболее распространенный способ контролировать открытие и закрытие программной клавиатуры — это отслеживать иерархию представлений. В иерархии представлений происходят глобальные события, такие как изменения макета. Мы можем отслеживать изменения макета, вызывая getViewTreeObserver. Пример кода выглядит следующим образом:
Фактически, необходимо оценить, существует ли строка состояния, но поскольку само приложение может определить, отображает ли текущий интерфейс высоту состояния, приведенный выше код отображает состояние по умолчанию.
3.2 Перепишите onMeasure корневого макета
Этот метод используется, когда для параметра windowSoftInputMode установлено значение adjustResize. Как упоминалось выше, adjustResize использует сжатую компоновку интерфейса для реализации нормального отображения виртуальной клавиатуры. Конкретный код выглядит следующим образом
Сравните два вышеуказанных метода:
- Преимущество первого метода заключается в том, что независимо от того, какой параметр windowSoftInputMode установлен, программную клавиатуру можно включать и выключать; для второго метода требуется указанная выше компоновка в качестве корневой компоновки интерфейса для реализации мониторинга.
- Недостатком первого метода является отслеживание после события, которое может получить монитор только после того, как он был onLayout, что приводит к тому, что интерфейс склонен к заставке; в то время как второй метод — получить монитор до интерфейса onLayout, поэтому вспышка не будет Ситуация с экраном.
Источник