Android клавіатура і апаратні кнопки

Апаратні і клавіатурні клавіші

Обробка апаратних клавіш і клавіатури має наступні методи

  • onKeyDown () - викликається при натисканні будь-якої апаратної клавіші;
  • onKeyUp () - викликається при відпуску будь-якій апаратній клавіші;

Крім клавіш, є ще інші методи обробки для користувача введення (тут не розглядаються):

  • onTrackballEvent () - спрацьовує при рухах трекболу;
  • onTouchEvent () - обробник подій сенсорного екрану, спрацьовує при торканні, прибирання пальця і ​​при перетягуванні.

Щоб ваші компоненти і активності реагували на натискання клавіш, перевизначите обробники подій onKeyUp () і onKeyDown ():

Параметр keyCode містить код клавіші, яка була натиснута; порівнюйте його зі статичними кодами клавіш, що зберігаються в класі KeyEvent. щоб виконувати відповідну обробку.

Параметр KeyEvent також включає в себе кілька методів: isAltPressed (). isShiftPressed () і isSymPressed (). визначають, чи були натиснуті функціональні клавіші, такі як Alt, Shift або Sym. Статичний метод isModifierKey () приймає keyCode і визначає, чи є натиснута клавіша модифікатором.

Кнопка Back: Ви впевнені, що хочете вийти з програми?

Щоб реалізувати таке завдання, потрібно перевизначити поведінку кнопки Back через метод onBackPressed () наступним чином:

Android клавіатура і апаратні кнопки

Даний метод з'явився в Android 2.0. Для більш ранніх версій використовувався стандартний код обробки onKeyDown ():

Подвійне натискання на кнопку Back

Інший варіант - вихід з програми при подвійному натисканні на кнопку Back. Зручно в тих випадках, коли вважаєте, що користувач може випадково натиснути на кнопку, наприклад, під час активної гри. Додаток закриється, якщо користувач двічі натисне на кнопку протягом двох секунд.

кнопка Home

Можна відстежити натискання кнопки Home через метод активності onUserLeaveHint ():

Обробка кнопки 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 і ін. Можливі такі значення:

Щоб побачити всі варіанти на власні очі, можете створити кілька текстових полів і перемикатися між ними:

Щоб реагувати на натискання різних станів кнопки 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 і перевіряти очікуване значення.

додаткове читання

Схожі статті