Setonkeylistener edittext android studio

Клавиатура и аппаратные кнопки

Аппаратные и клавиатурные клавиши

Обработка аппаратных клавиш и клавиатуры имеет следующие методы

  • 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 и проверять ожидаемое значение.

Читайте также:  Mobile navigation для android

Источник

Ограничить edittext одной строкой

Возможный дубликат: android-singleline-true-not-work-for-edittext

Я хочу, чтобы вышеупомянутый EditText имел только одну строку. Даже если пользователь нажимает «Enter», курсор не должен опускаться во вторую строку. Может ли кто-нибудь помочь мне в этом?

Использовать android:maxLines=»1″ и android:inputType=»text»

Вы забыли атрибут android: maxLines . И обратитесь к android: inputType. В вашем примере ниже приведен этот результат:

Использование android:singleLine=»true» устарело.

Просто добавьте свой тип ввода и установите maxline на 1, и все будет работать нормально

android:singleLine теперь устарела. Из документации :

Эта константа была устарела в уровне API 3.

Этот атрибут устарел. maxLines этого используйте maxLines для изменения макета статического текста и используйте флаг textMultiLine в атрибуте inputType вместо доступных для редактирования текстовых представлений (если поставляются как singleLine, так и inputType, флаги inputType будут переопределять значение singleLine).

Таким образом, вы можете просто установить android:inputType=»textEmailSubject» или любое другое значение, соответствующее содержимому поля.

Вы должны добавить эту строку в свой EditText в xml:

Добавьте вышеприведенный код, чтобы иметь одну строку в теге EditText в вашем макете.

Эта константа была устарела в уровне API 3 .

Этот атрибут устарел. Вместо этого используйте maxLines для изменения макета статического текста и используйте флаг textMultiLine в атрибуте inputType вместо доступных для редактирования текстовых представлений (если поставляются как singleLine, так и inputType, флаги inputType будут переопределять значение singleLine).

Теперь android:singleLine атрибут android:singleLine устарел. Добавьте эти атрибуты в свой EditText чтобы EditText был отдельной строкой.

В прошлом я делал это с помощью android:singleLine=»true» а затем добавлял слушатель для клавиши «enter»:

Каждый демонстрирует XML-способ, за исключением того, что один человек показал вызов метода setMaxLines EditText. Однако, когда я это сделал, это не сработало. Одна вещь, которая работала для меня, – это установка типа ввода.

Это позволяет использовать AZ, az, 0-9 и специальные символы, но не позволяет вводить нажатие. Когда вы нажмете enter, он перейдет к следующему компоненту GUI, если это применимо в вашем приложении.

Вы также можете установить максимальное количество символов, которые могут быть помещены в этот EditText, иначе он будет толкать все, что находится справа от него, или просто начинать завершение самого экрана. Вы можете сделать это следующим образом:

Это устанавливает максимальные символы в 8 в этом EditText. Надеюсь, все это вам поможет.

Это будет работать для EditText:

Тогда я бы установил максимальную длину для входного текста:

Это те, которые нужны сейчас.

Чтобы ограничить, вам просто нужно установить опцию одиночной строки на «true».

Используйте вместо кода ниже код

@Aleks G OnKeyListener () работает очень хорошо, но я запускал его из MainActivity, поэтому мне пришлось немного его модифицировать:

Надеюсь, это поможет любому, кто пытается сделать то же самое.

Также важно обратить внимание, если свойство android: inputType – textMultiLine . Если это так, свойства android: singleLine, android: imeOptions, android: ellipsize и android maxLines будут проигнорированы, и ваш EditText будет принимать MultiLines в любом случае.

Добавьте эту строку в свой текст

Android: inputType = «текст»

Поскольку android:singleLine=»true» теперь амортизируется, поэтому используйте

андроид: MAXLINES = «1»

Вместо этого используйте maxLines для изменения макета статического текста и используйте флаг textMultiLine в атрибуте inputType вместо доступных для редактирования текстовых представлений (если поставляются как singleLine, так и inputType, флаги inputType будут переопределять значение singleLine).

Источник

Basic Event Listeners

Event Listening in Android development is largely centered around the View object.

Any View (Button, TextView, etc) has many event listeners that can be attached using the setOnEvent pattern which involves passing a class that implements a particular event interface. The listeners available to any View include:

  • setOnClickListener — Callback when the view is clicked
  • setOnDragListener — Callback when the view is dragged
  • setOnFocusChangeListener — Callback when the view changes focus
  • setOnGenericMotionListener — Callback for arbitrary gestures
  • setOnHoverListener — Callback for hovering over the view
  • setOnKeyListener — Callback for pressing a hardware key when view has focus
  • setOnLongClickListener — Callback for pressing and holding a view
  • setOnTouchListener — Callback for touching down or up on a view
Читайте также:  Gif player для андроид

Using Java

In Java Code, attaching to any event works roughly the same way. Let’s take the OnClickListener as an example. First, you need a reference to the view and then you need to use the set method associated with that listener and pass in a class implementing a particular interface. For example:

Alternatively, it is sometimes useful to have your class implement the listener directly, in which case you would add the listener implementation to your class and pass a reference to your class to the set method. For Example:

This pattern works for any of the view-based event listeners.

Using XML

In addition onClick has a unique shortcut that allows the method to specified within the layout XML. So rather than attaching the event manually in the Java, the method can be attached in the view. For example:

Within the Activity that hosts this layout, the following method handles the click event:

In addition to the standard View listeners, AdapterView descendants have a few more key event listeners having to do with their items:

  • setOnItemClickListener — Callback when an item contained is clicked
  • setOnItemLongClickListener — Callback when an item contained is clicked and held
  • setOnItemSelectedListener — Callback when an item is selected

This works similarly to a standard listener, simply implementing the correct AdapterView.OnItemClickListener interface:

This works similarly for the setting up a «long click» where an item is pressed and held down using the OnItemLongClickListener:

Troubleshooting: Item Click Not Firing If the item is more complex and does not seem to be properly responding to clicks after setting up the handler, the views inside the item might be drawing the focus. Check out this stackoverflow post and add the property android:descendantFocusability=»blocksDescendants» to the root layout within the template for the item.

In addition to the listeners described above, there are a few other common listeners for input fields in particular.

  • addTextChangedListener — Fires each time the text in the field is being changed
  • setOnEditorActionListener — Fires when an «action» button on the soft keyboard is pressed

If you want to handle an event as the text in the view is being changed, you only need to look as far as the addTextChangedListener method on an EditText (or even TextView):

This is great for any time you want to have the UI update as the user enters text.

Another case is when you want an action to occur once the user has finished typing text with the Soft Keyboard. Keep in mind that this is especially useful when you can see the virtual keyboard which is disabled by default in the emulator but can be enabled as explained in this graphic.

First, we need to setup an «action» button for our text field. To setup an «action button» such as a Done button on the soft Keyboard, simply configure your EditText with the following properties:

In particular, singleLine and imeOptions are required for the Done button to display. Now, we can hook into a editor listener for when the done button is pressed with:

This is often great whenever a user needs to type text and then explicitly have an action performed when they are finished. There are many imeOptions for different situations.

Similarly to EditText, many common input views have listeners of their own including NumberPicker has setOnValueChangedListener and SeekBar has setOnSeekBarChangeListener which allow us to listen for changes:

Almost all input views have similar methods available.

Источник

Оцените статью