Как поймать нажатие клавиши "готово" с мягкой клавиатуры
Как я могу поймать определенные ключевые события с мягкой клавиатуры? в частности, меня интересует ключ "готово".
11 ответов:
Примечание: этот ответ стар и больше не работает. Смотрите ответы ниже.
вы ловите 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) != 0) { doSomething(); return true; } else { return false; } } });
ответ @ Swato не был полным для меня (и не компилируется!) Итак, я показываю, как сделать сравнение с выполненными и следующими действиями.
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 необходимо слушать "enter" или "next", и вы не можете использовать 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; } });
чтобы поймать" готово " нажмите клавишу из метода onKeyUp действия переопределения мягкой клавиатуры. Установка прослушивателя 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; }
У меня есть EditText, который ищет имена, и он автоматически показывает результаты ниже в ListView. Клавиатура SoftInput показывала только кнопку "Далее" и знак ввода, который ничего не делал. Я хотел только кнопку Done (нет следующего или введите знак), а также я хотел, чтобы он был нажат, он должен закрыть клавиатуру, потому что пользователь должен видеть результаты ниже.
решение, которое я нашел /г-н Сирил Мотье в своем блоге/ было очень простым и работало без какого-либо дополнительного кода: в 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" />
Примечание: inputType упоминание в вашем 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; } });
вы можете переопределить ключевое событие 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; } });
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) ...