Intereting Posts
Cursor.getType () для уровня API <11 Как можно создать прядильщик с изображениями вместо текста? Android GoogleMap нуждается в активации? Как сделать ход для 3 сторон для формы в андроиде? ZipException при преобразовании в dex с Ant, в eclipse он работает нормально StaggeredGridLayout испортится при прокрутке вверх Android RecyclerView Scroll Bug Есть ли у RecyclerView какие-либо преимущества, кроме того, что заставить разработчиков использовать шаблон ViewHolder? Как перестроить приложение «Launcher» по умолчанию? Как создать новый проект андроида без использования библиотек поддержки? Где Android принимает часовой пояс по умолчанию? Ошибка Proguard Неподдерживаемый номер версии класса Как мне перенаправить параметры Intent через цепочки действий? Crashlytics: использование сервера сборки для выпуска и загрузки дистрибутива приложения для Android Полный экран С панелью инструментов и edittext внизу андроида

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

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

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

Вы поймаете 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; } });