На одном телефоне, на котором я тестирую (HTC Incredible, Android 2.2, Software 3.21.605.1), я испытываю следующее поведение.
Обработчик события onEditorAction вызывается дважды (сразу же), когда нажата клавиша Enter на клавиатуре интерфейса Sense.
KeyEvent.getEventTime() является тем же самым для обоих случаев, когда вызывается событие, что приводит меня к этому обходу:
protected void onCreate(Bundle savedInstanceState) {
[...]
EditText text = (EditText)findViewById(R.id.txtBox);
text.setOnEditorActionListener(new OnEditorActionListener() {
private long lastCalled = -1;
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ( event.getEventTime() == lastCalled ) {
return false;
} else {
lastCalled = event.getEventTime();
handleNextButton(v);
return true;
}
}
});
[...]
}
Текст EditText определяется как:
<EditText
android:layout_width="150sp"
android:layout_height="wrap_content"
android:id="@+id/txtBox"
android:imeOptions="actionNext"
android:capitalize="characters"
android:singleLine="true"
android:inputType="textVisiblePassword|textCapCharacters|textNoSuggestions"
android:autoText="false"
android:editable="true"
android:maxLength="6"
/>
На всех других устройствах, на которых я тестировал, кнопка действия правильно помечена как "Далее", и событие вызывается только один раз при нажатии этой кнопки.
Является ли это ошибкой в Sense UI клавиатуре, или я делаю что-то неправильно?
Спасибо за любую помощь.
Обновлено - благодаря полученным ответам, я определился со следующим как мои проверки. Это отлично работает на обоих телефонах, которые я имею для тестирования (Sense UI и Cyanogenmod CM7)
if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) {
return false;
}
if ( actionId != EditorInfo.IME_ACTION_NEXT && actionId != EditorInfo.IME_NULL ) {
return false;
}