Как поймать нажатие клавиши «Готово» с помощью мягкой клавиатуры

Как я могу уловить определенные ключевые события с мягкой клавиатуры? В частности, меня интересует ключ «Готово».

Примечание. Этот ответ старый и больше не работает. См. Ответы ниже.

Вы поймаете KeyEvent, а затем проверьте его код. FLAG_EDITOR_ACTION используется для идентификации ключей ввода, которые поступают из IME, ключ ввода которого был автоматически помечен как «следующий» или «сделанный»,

if (event.getKeyCode() == KeyEvent.FLAG_EDITOR_ACTION) //your code here 

Найдите документы здесь .

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

Однако использование OnEditorActionListener сработало, и это также позволило мне провести различие между ними, сравнив значение действия с определенными константами EditorInfo.IME_ACTION_NEXT и EditorInfo.IME_ACTION_DONE .

 editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_MASK_ACTION) { doSomething(); return true; } else { return false; } } }); 

@ Ответ Свато был неполным для меня (и не компилируется!), Поэтому я показываю, как сделать сравнение с действиями DONE и NEXT.

 editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { int result = actionId & EditorInfo.IME_MASK_ACTION; switch(result) { case EditorInfo.IME_ACTION_DONE: // done stuff break; case EditorInfo.IME_ACTION_NEXT: // next stuff break; } } }); 

Также хочу отметить, что для JellyBean и выше OnEditorActionListener необходимо прослушивать «ввод» или «следующий», и вы не можете использовать OnKeyListener. Из документов:

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

Ссылка: http://developer.android.com/reference/android/view/KeyEvent.html

Просто сделайте вот так:

 editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if(actionId == EditorInfo.IME_ACTION_DONE) { //Do Something } return false; } }); 
  etSearchFriends = (EditText) findViewById(R.id.etSearchConn); etSearchFriends.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { // If the event is a key-down event on the "enter" button if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { Toast.makeText(ACTIVITY_NAME.this, etSearchFriends.getText(),Toast.LENGTH_SHORT).show(); return true; } return false; } }); 

У меня есть EditText, который ищет имена, и он автоматически показывает результаты ниже в ListView. Клавиатура SoftInput отображала только «следующую» кнопку и вводила знак, который ничего не делал. Я хотел только кнопку «Готово» (нет следующего или ввести знак), а также я хотел, чтобы она была нажата, она должна закрывать клавиатуру, потому что пользователь должен видеть результаты ниже нее.

Решение, которое я нашел / от г-на Кирилла Моттье в своем блоге / было очень простым, и оно работало без какого-либо дополнительного кода: в xml, где находится EditText, это должно быть написано: android: imeOptions = "actionDone"

Поэтому клавиатура с клавишей Done, EditText должна выглядеть так:

 <EditText android:id="@+id/editText1central" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/imageView1" android:layout_toLeftOf="@+id/imageView2tie" android:ems="10" android:imeOptions="actionDone" android:hint="@string/trazi" android:inputType="textPersonName" /> 

Примечание: имя ввода в редакторе edittext.

 <EditText android:id="@+id/select_category" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" > edittext.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) { //do something here. return true; } return false; } }); 

Чтобы поймать нажатие клавиши «Готово» с мягкой клавиатуры, переопределите метод onKeyUp Activity. Настройка прослушивателя OnKeyListener для представления не будет работать, потому что нажатие клавиш в методах ввода программного обеспечения, как правило, не вызывает методы этого слушателя, этот обратный вызов вызывается, когда аппаратный ключ нажат в представлении.

 // Called when a key was released and not handled by any of the views inside of the activity. @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_ENTER: // code here break; default: return super.onKeyUp(keyCode, event); } return true; } 

IME_MASK_ACTION – 255, а принятое actionId – 6, а мой компилятор не принимает

 if (actionId & EditorInfo.IME_MASK_ACTION) 

Который является int. Каково использование & -ing 255 в любом случае? Таким образом, тест просто может быть

 public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) ... 

Вы можете переопределить это событие:

 editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { // do your stuff here } return false; } }); 
Intereting Posts
Не удалось получить пробную версию Android Token DrEdit Android Spinner – Как сделать раскрывающийся список прозрачным? Предпочтения без устаревших методов Неожиданный код ответа 403 для https://www.googleapis.com/games/v1/players/1123xxxxxx11712506520 и других ошибок в игровых сервисах Отправить приглашение через приложение Android для друзей facebook NameError: uninitialized constant Rpush :: Gcm Я пытаюсь использовать rpush для своего мобильного приложения. Но я продолжаю получать эту ошибку Есть ли способ показать полосу прокрутки ListView все время? Как изменить терминал в Android Studio на iTerm2? Android, Push-уведомление с использованием parse.com, автоматически запускает приложение Приложение получает дублирующее уведомление с использованием GCM после повторной установки Как реализовать несколько версий Android для использования разных библиотек? Как изменить цвет поиска? Разница между проектом чистого проекта и восстановлением в студии Android Как изменить сообщение (тело) AlertDialog в onPrepareDialog ()? Android: В чем разница между Activity.runOnUiThread и View.post?