как я могу поймать определенные ключевые события с мягкой клавиатуры? в частности, меня интересует ключ "Готово".
Как поймать нажатие клавиши "Готово" с помощью мягкой клавиатуры
Ответ 1
Примечание: Этот ответ старый и больше не работает. См. Ответы ниже.
Вы поймаете KeyEvent, а затем проверьте его код. FLAG_EDITOR_ACTION используется для идентификации ключей ввода, которые поступают из IME, клавиша ввода которой была автоматически помечена как "следующая" или "сделанная"
if (event.getKeyCode() == KeyEvent.FLAG_EDITOR_ACTION)
//your code here
Найти docs здесь.
Ответ 2
Я не совсем уверен, какой из слушателей был использован в принятом ответе.
Я использовал 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;
}
}
});
Ответ 3
Ответ @Swato был неполным для меня (и не компилируется!), поэтому я показываю, как сделать сравнение с действиями 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 необходимо прослушивать 'enter' или 'next', и вы не можете использовать OnKeyListener. Из документов:
Как мягкие методы ввода могут использовать множественные и изобретательные способы ввода текста, нет никакой гарантии, что любое нажатие клавиши на мягкой клавиатуре вызовет ключевое событие: это остается на усмотрение IME и фактически отправляет такие события не приветствуются. Вы никогда не должны полагаться на получение KeyEvents для любой клавиши с помощью метода мягкого ввода.
Ссылка: http://developer.android.com/reference/android/view/KeyEvent.html
Ответ 4
просто выполните следующие действия:
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
if(actionId == EditorInfo.IME_ACTION_DONE)
{
//Do Something
}
return false;
}
});
Ответ 5
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;
}
});
Ответ 6
Чтобы уловить нажатие клавиши "Готово" с помощью мягкой клавиатуры, переопределите метод Activity 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;
}
Ответ 7
У меня есть EditText, который ищет имена, и он автоматически показывает результаты ниже в ListView. Клавиатура SoftInput отображала только "следующую" кнопку и вводила знак, который ничего не делал. Мне нужна только кнопка "Готово" (нет следующего или вводить знак), а также я хотел ее, когда она была нажата, она должна закрыть клавиатуру, потому что пользователь должен увидеть результаты ниже.
Решение, которое я нашел/г-н Кирилл Моттье в своем блоге/было очень простым, и он работал без какого-либо дополнительного кода: в xml, где находится EditText, это должно быть написано: андроид: 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" />
Ответ 8
Примечание: имя ввода в вашем редакторе.
<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;
}
});
Ответ 9
вы можете переопределить сделанное ключевое событие с помощью этого метода:
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;
}
});
Ответ 10
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)
...
Ответ 11
editText = (EditText) findViewById(R.id.edit_text);
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// code here
}
return false;
}
});