Setoneditoractionlistener android studio пример

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

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.

Источник

android EditText-законченное событие ввода

Я хочу поймать событие, когда пользователь закончит редактирование EditText.

Как это можно сделать?

12 ответов

когда пользователь закончит редактирование, он нажмет Done или Enter

лучший способ, вы также можете использовать EditText onfocuschange listener, чтобы проверить, сделал ли пользователь редактирование:(не нужно полагаться на пользователя нажав кнопку Готово или клавишу Enter на клавиатуре)

Я лично предпочитаю автоматическую отправку после окончания ввода. Вот как вы можете обнаружить это событие.

объявления и инициализация:

слушатель, например, onCreate ()

Итак, когда текст изменен, таймер начинает ждать каких-либо следующих изменений. Когда они происходят, таймер отменяется, а затем запускается еще раз.

Вы можете сделать это с помощью setOnKeyListener или с помощью textWatcher, как:

установить text watcher editText.addTextChangedListener(textWatcher);

оба ответа @Reno и @Vinayak B вместе, если вы хотите скрыть клавиатуру после действия

хотя многие ответы указывают в правильном направлении, я думаю, что ни один из них не отвечает на то, о чем думал автор вопроса. Или, по крайней мере, я понял вопрос по-другому, потому что я искал ответ на подобную проблему. Проблема в том,» как узнать, когда пользователь перестает печатать, не нажимая кнопку», и вызвать некоторое действие (например, автозаполнение). Если вы хотите сделать это, запустите таймер в onTextChanged с задержкой, которую вы считаете остановленной пользователем набрав (например, 500-700ms), для каждой новой буквы при запуске таймера отмените предыдущую (или, по крайней мере, используйте какой-то флаг, когда они тикают, они ничего не делают). Вот похожий код на то, что я использовал:

Читайте также:  Как сделать нетбук андроидом

обратите внимание, что я изменяю запуск логического флага внутри моей асинхронной задачи (Задача получает json с сервера для автоматического завершения).

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

хорошо это будет работать 100% точно.

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

другой подход . вот пример: Если пользователь имеет задержку 600-1000ms при вводе текста, вы можете считать, что он остановился.

У меня была та же проблема, и я не хотел полагаться на пользователя, нажимая «готово» или «ввод».

моей первой попыткой было использовать прослушиватель onFocusChange, но оказалось, что мой EditText получил фокус по умолчанию. Когда пользователь нажал какое-то другое представление, onFocusChange был запущен без того, чтобы пользователь когда-либо назначил ему фокус.

следующее решение сделало это для меня, где onFocusChange прикрепляется, если пользователь коснулся EditText:

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

У меня была та же проблема при попытке реализовать «теперь ввод» в приложении чата. попробуйте расширить EditText следующим образом:

Я закончил ее с той же проблемой, и я не мог использовать решение с onEditorAction или onFocusChange и не хотел пробовать таймер. Таймер слишком опасен на вкус, из-за всех потоков и слишком непредсказуем, так как вы не знаете, когда выполняется код.

onEditorAction не ловят, когда пользователь уходит без использования кнопки, и если вы используете его, обратите внимание, что KeyEvent может быть null. Фокус ненадежен на обоих концах, которые пользователь может получить сфокусируйтесь и оставьте без ввода текста или выбора поля, и пользователю не нужно оставлять последнее поле EditText.

мое решение использует onFocusChange и флаг, установленный, когда пользователь начинает редактировать текст и функцию для получения текста из последнего сфокусированного представления, которое я вызываю при необходимости.

Я просто очищаю фокус на всех моих текстовых полях, чтобы tricker оставить текстовый код представления, код clearFocus выполняется только в том случае, если поле имеет фокус. Я вызываю функцию в onSaveInstanceState поэтому мне не нужно сохранять флаг (mEditing) как состояние представления EditText и когда нажимаются важные кнопки и когда действие закрыто.

будьте осторожны с TexWatcher, как это вызов часто я использую условие на фокус, чтобы не реагировать, когда onrestoreinstancestate код ввода текста. Я!—2—>

Источник

android EditText — событие завершения набора текста

Я хочу поймать событие, когда пользователь заканчивает редактирование EditText.

Как это сделать?

Когда пользователь закончит редактирование, он / она нажмет Done или Enter

Лучше всего, вы также можете использовать EditText onFocusChange listener, чтобы проверить, выполнил ли пользователь редактирование: (не нужно полагаться на то, что пользователь нажимает кнопку Done или Enter на мягкой клавиатуре)

Примечание. Для более чем одного EditText вы также можете позволить своему классу реализовать, а View.OnFocusChangeListener затем установить слушателей для каждого из вас EditText и проверить их, как показано ниже.

Я лично предпочитаю автоматическую отправку после окончания набора. Вот как вы можете обнаружить это событие.

Объявления и инициализация:

Слушатель, например, в onCreate ()

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

Вы можете сделать это с помощью setOnKeyListener или с помощью textWatcher, например:

Установить наблюдатель текста editText.addTextChangedListener(textWatcher);

Хотя многие ответы действительно указывают в правильном направлении, я думаю, что ни один из них не отвечает на то, о чем думал автор вопроса. Или, по крайней мере, я иначе понял вопрос, потому что искал ответ на похожую проблему. Проблема заключается в том, «как узнать, когда пользователь прекращает вводить текст без нажатия кнопки» и запускать какое-либо действие (например, автозаполнение). Если вы хотите сделать это, запустите таймер в onTextChanged с задержкой, которую вы считаете, что пользователь перестал печатать (например, 500-700 мс), для каждой новой буквы, когда вы запускаете таймер, отменяйте предыдущую (или, по крайней мере, используйте какой-то отметьте, что когда они ставят галочку, они ничего не делают). Вот код, аналогичный тому, что я использовал:

Обратите внимание, что я изменяю рабочий логический флаг внутри моей асинхронной задачи (Task получает json с сервера для автозаполнения).

Также имейте в виду, что это создает много задач таймера (я думаю, что они запланированы в одном потоке, но вам нужно это проверить), поэтому, вероятно, есть много мест, которые можно улучшить, но этот подход также работает, и суть в том, что вы должны используйте таймер, поскольку нет сообщения «Пользователь прекратил вводить сообщение»

оба @Reno и @Vinayak B ответят вместе, если вы хотите скрыть клавиатуру после действия

Другой подход . вот пример: если у пользователя есть задержка в 600-1000 мс при вводе текста, вы можете считать, что он остановился.

Хорошо, это наверняка сработает на 100%.

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

Я решил эту проблему таким образом. Я использовал котлин.

У меня была такая же проблема, и я не хотел полагаться на то, что пользователь нажимает Done или Enter.

Моя первая попытка состояла в том, чтобы использовать прослушиватель onFocusChange, но оказалось, что мой EditText получил фокус по умолчанию. Когда пользователь нажимал какое-то другое представление, onFocusChange запускался без того, чтобы пользователь никогда не назначал ему фокус.

Читайте также:  Что такое gcam для андроид

Следующее решение сделало это для меня, где onFocusChange прикреплен, если пользователь коснулся EditText:

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

У меня была такая же проблема при попытке реализовать «сейчас набираю текст» в приложении чата. попробуйте расширить EditText следующим образом:

Я покончил с ней с той же проблемой, и я не мог использовать решение с onEditorAction или onFocusChange и не хотел пробовать таймер. Таймер слишком опасен для вкуса из-за всех потоков и слишком непредсказуем, поскольку вы не знаете, когда ваш код выполняется.

OnEditorAction не улавливает, когда пользователь уходит без использования кнопки, и если вы его используете, обратите внимание, что KeyEvent может иметь значение null. Фокус ненадежен на обоих концах, пользователь может получить фокус и уйти, не вводя текст или не выбирая поле, и пользователю не нужно оставлять последнее поле EditText.

В моем решении используется onFocusChange и установлен флаг, когда пользователь начинает редактировать текст, и функцию для получения текста из последнего сфокусированного представления, которое я вызываю при необходимости.

Я просто снимаю фокус со всех своих текстовых полей, чтобы обмануть код представления оставленного текста. Код clearFocus выполняется только в том случае, если поле имеет фокус. Я вызываю функцию в onSaveInstanceState, поэтому мне не нужно сохранять флаг (mEditing) как состояние представления EditText и при нажатии важных кнопок и при закрытии действия.

Будьте осторожны с TexWatcher, так как он часто вызывается. Я использую условие фокуса, чтобы не реагировать, когда код onRestoreInstanceState вводит текст. я

Источник

Методы активности

Методы

В статье приведены только часть методов. Остальные изучайте самостоятельно через документацию.

При переходе активности от одного состояния к другому, она получает уведомления через защищенные методы:

  • protected void onCreate(Bundle savedInstanceState);
  • protected void onStart();
  • protected void onRestart();
  • protected void onResume();
  • protected void onPause();
  • protected void onStop();
  • protected void onDestroy()

Из перечисленных методов в вашем классе обязательно должен быть метод onCreate(), которая задаёт начальную установку параметров при инициализации активности. Вторым по популярности является метод onPause(), используемый для сохранения пользовательских настроек активности и подготовиться к прекращению взаимодействия с пользователем.

При реализации любого из этих методов необходимо всегда сначала вызывать версию этого метода из суперкласса. Например:

Семь перечисленных методов определяют весь жизненный цикл активности. Есть три вложенных цикла, которые вы можете отслеживать в классе активности:

  • полное время жизни (entire lifetime) — время с момента первого вызова метода onCreate() до вызова onDestroy(). Активность делает всю начальную установку своего глобального состояния в методе onCreate() и освобождает все остающиеся ресурсы в onDestroy(). Например, если активность порождает дополнительный поток, выполняющийся в фоновом режиме, можно создать этот поток в методе onCreate() и затем остановить поток в методе onDestroy();
  • видимое время жизни (visible lifetime) — время между вызовом метода onStart() и вызовом onStop(). В это время пользователь может видеть окно активности на экране, хотя окно может не быть на переднем плане и может не взаимодействовать с пользователем. Между этими двумя методами вы можете поддерживать в коде ресурсы, которые необходимы, чтобы отображать активность пользователю;
  • активное время жизни (foreground lifetime) — время между вызовами onResume() и onPause(). В это время окно активности находится на переднем плане и взаимодействует с пользователем. Активность в процессе работы приложения может часто переходить между состояниями active и paused, поэтому код в этих двух методах должен быть или небольшим по объему (чтобы не замедлять работу приложения во время выполнения), или порождать дополнительные потоки, если требуется выполнение задач, занимающих длительное время.

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

Как видно из кода, переопределяя эти обработчики, вы всегда должны вызывать одноимённые методы родительского класса.

Методы жизненного цикла описаны в отдельной статье. Здесь их опишем кратко и рассмотрим другие методы.

Метод addContentView()

Метод addContentView() добавляет компонент к уже существующей разметке. Пример смотрите здесь.

Метод findViewById()

Метод findViewById() позволяет получить ссылку на View, которая размещена в разметке через его идентификатор.

Если вы используете фрагменты, то когда они загружаются в активность, то компоненты, входящие в состав фрагмента, становятся частью иерархии активности. И вы можете использовать метод findViewById() для получения ссылки к компоненту фрагмента.

Не путать с одноимённым методом для класса View.

Метод finish()

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

Метод getFragmentManager()

Каждая активность включает в себя Менеджер фрагментов для управления фрагментами, если они используются. Метод getFragmentManager() позволяет получить доступ к данному менеджеру. На сайте есть отдельные статьи, посвящённые фрагментам.

Метод getParentActivityIntent()

Возвращает намерение, которое может запускать активность, являющей родительской. Родительская активность прописывается в манифесте. Вы можете переопределить данное намерение для своих целей. Метод появился в API 16.

Метод onActivityResult()

Дочерняя активность может произвольно возвратить назад объект Intent, содержащий любые дополнительные данные. Вся эта информация в родительской активности появляется через метод обратного вызова Activity.onActivityResult(), наряду с идентификатором, который она первоначально предоставила.

Если дочерняя активность завершится неудачно или будет закрыта пользователем без подтверждения ввода через кнопку Back, то родительская активность получит результат с кодом RESULT_CANCELED.

Метод принимает несколько параметров:

  • Код запроса — тот код, который использовался для запуска дочерней активности, возвращающий результат.
  • Результирующий код — код результата, поступающий от дочерней активности, как правило, RESULT_OK или RESULT_CANCELED
  • Данные — намерение может включать в себя различные данные в виде параметра extras внутри намерения.

Метод onBackPressed()

Метод, позволяющий отследить нажатине на кнопку Back. Появился в Android 2.0 (API 5). Пример использования можно посмотреть в статье Кнопка Back: Вы уверены, что хотите выйти из программы?.

Читайте также:  Алиса не распознает голос андроид

Метод onConfigurationChanged()

Метод, который вызывается при изменении конфигурации устройства. Если в манифесте были установлены специальные параметры у атрибута android:configChanges, то данный метод не будет вызван.

Метод onKeyShortcut()

Метод onPostCreate()

Новый метод, который появился в API 21. Он вызывается позже onCreate() и в нём можно получить значения размеров компонентов, которые недоступны при построении интерфейса в методе onCreate().

Метод overridePendingTransition()

Метод overridePendingTransition() позволяет задать анимацию при переходе от одной активности к другой. Пример смотрите здесь.

Метод onRestoreInstanceState()

У метода onRestoreInstanceState() есть такой же параметр Bundle, как у onCreate(), и вы можете восстанавливать сохранённые значения из метода onSaveInstanceState(). Во многих случаях это пример личных предпочтений, какой из двух методов использовать для восстановления данных.

Метод вызывается после метода onStart(). Система вызывает метод onRestoreInstanceState() только в том случае, если имеются сохранённые данные для восстановления. Таким образом вам не нужно проверять Bundle на null, как в методе onCreate():

Метод onSaveInstanceState()

Когда система завершает активность в принудительном порядке, чтобы освободить ресурсы для других приложений, пользователь может снова вызвать эту активность с сохранённым предыдущим состоянием. Чтобы зафиксировать состояние активности перед её уничтожением, в классе активности необходимо реализовать метод onSaveinstancestate().

Сам метод вызывается прямо перед методом onPause(). Он предоставляет возможность сохранять состояние пользовательского интерфейса активности в объект Bundle, который потом будет передаваться в методы onCreate() и onRestoreInstanceState(). В объект Bundle можно записать параметры, динамическое состояние активности как пары «ключ-значение». Когда активность будет снова вызвана, объект Bundle передаётся системой в качестве параметра в методы onCreate() и onRestoreInstanceState(), которые вызываются после onStart(), чтобы один из них или они оба могли установить активность в предыдущее состояние. Прежде чем передавать изменённый параметр Bundle в обработчик родительского класса, сохраните значения с помощью методов putXXX() и восстановите с помощью getXXX().

Используйте обработчик onSaveInstanceState() для сохранения состояния интерфейса (например, состояния флажков, текущего выделенного элемента или введенных, но не сохранённых данных), чтобы объект Activity при следующем входе в активное состояние мог вывести на экран тот же UI. Рассчитывайте, что перед завершением работы процесса во время активного состояния будут вызваны обработчики onSaveInstanceState и onPause.

В отличие от базовых методов, методы onSaveInstanceState() и onRestoreInstanceState() не относятся к методам жизненного цикла активности. Система будет вызывать их не во всех случаях. Например, Android вызывает onSaveinstancestate() прежде, чем активность становится уязвимой к уничтожению системой, но не вызывает его, когда экземпляр активности разрушается пользовательским действием (при нажатии клавиши BACK). В этом случае нет никаких причин для сохранения состояния активности.

Метод onSaveInstanceState() вызывается системой в случае изменения конфигурации устройства в процессе выполнения приложения (например, при вращении устройства пользователем или выдвижении физической клавиатуры устройства.

Поскольку метод onSaveinstanceState() вызывается не во всех случаях, его необходимо использовать только для сохранения промежуточного состояния активности. Для сохранения данных лучше использовать метод onPause().

Этот обработчик будет срабатывать всякий раз, когда жизненный цикл активности начнёт подходить к концу, но только в том случае, если её работа не будет завершена явно (при вызове метода finish()). Вследствие этого обработчик используется для проверки целостности состояния активности между активными жизненными циклами одиночной пользовательской сессии.

Сохранённый параметр Bundle передается методам onRestoreInstanceState() и onCreate(), если приложение принудительно перезапускается на протяжении сессии. В листинге показано, как извлечь значения из этого параметра и использовать их для обновления состояния экземпляра активности.

В API 28 метод вызывается после метода onStop(), в ранних версиях до метода onStop().

Метод onUserLeaveHint()

Позволяет отследить нажатие кнопки Home

Метод requestWindowFeature()

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

Метод onWindowFocusChanged()

Метод позволяет определить момент получения фокуса вашим приложением.

Метод может быть полезен, так как он срабатывает позже метода onCreate(). Например, для вычисления размеров кнопки на экране этот метод предпочтительнее, так как уже известно, что все элементы загрузились и доступны, тогда как в onCreate() могут возвратиться пустые значения ширины и высоты кнопки. Пример использования.

Метод setContentView()

Изначально экран активности пуст. Чтобы разместить пользовательский интерфейс, необходимо вызвать метод setContentView(). У метода есть две перегруженные версии. Вы можете передать в параметре либо экземпляр компонента (View), либо идентификатор ресурса (наиболее распространённый способ).

Пример с использованием экземпляра компонента:

В этом примере вы увидите на экране текстовое поле с текстом. Но при таком способе вы можете использовать только один компонент. А если экран состоит из множества кнопок и прочих элементов управления, то нужно использовать разметку.

Метод setFeatureDrawableResource()

С помощью данного метода можно вывести значки в правой части заголовка. Смотри пример.

Метод setRequestedOrientation()

Метод позволяет программно изменить ориентацию экрана. Пример использования.

Метод startActivity()

Чтобы запустить новую активность, используется метод startActivity(Intent). Этот метод принимает единственный параметр — объект Intent, описывающий активность, которая будет запускаться. Смотри пример Activity.

Метод startActivityForResult()

Иногда требуется вернуть результат активности, когда она закрывается. Например, можно запустить активность, которая позволяет пользователю выбирать человека в списке контактов. При закрытии активность возвращает данные человека, который был выбран: его полное имя и телефон. В этом случае необходимо вызвать метод startActivityForResult()

Метод startActivityForResult(Intent, int) со вторым параметром, идентифицирующим запрос позволяет возвращать результат. Когда дочерняя активность закрывается, то в родительской активности срабатывает метод onActivityResult(int, int, Intent), который содержит возвращённый результат, определённый в родительской активности.

Метод setResult()

Когда активность завершится, вы можете вызвать метод setResult(int), чтобы возвратить данные назад в родительскую активность (до метода finish()). Этот метод возвращает код результата закрытия активности, который может быть стандартными результатами Activity.RESULT_CANCELED, Activity.RESULT_OK или определяемым пользователем результатом RESULT_FiRST_USER (можете придумать любую константу с целочисленным значением).

Если в дочерней активности есть кнопка отмены, то код может быть следующим:

Если метод finish() вызвать раньше метода setResult(), то результирующий код установится в RESULT_CANCELED автоматически, а возвращённое намерение покажет значение null.

Источник

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