Проблема с Android EditText: KeyListener
В компоненте EditText
я пытаюсь установить KeyListener
, чтобы поймать клавишу ENTER (для проверки формы).
text.setKeyListener(new KeyListener() {
@Override
public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
return false;
}
@Override
public boolean onKeyOther(View view, Editable text, KeyEvent event) {
return false;
}
@Override
public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
onKeyEnterPressedListener.onKeyEnterPressed(AKText.this);
return true;
} else {
return false;
}
}
@Override
public int getInputType() {
return 1;
}
@Override
public void clearMetaKeyState(View view, Editable content, int states) {
}
});
Проблема заключается в том, что всякий раз, когда я набираю EditText
с помощью клавиатуры, все клавиши игнорируются и игнорируются мои нажатия клавиш. Тем не менее, мягкая панель на эмуляторе работает.
Как это исправить?
Ответы
Ответ 1
Вместо этого я использовал бы TextWatcher:
private TextWatcher tw = new TextWatcher() {
public void afterTextChanged(Editable s){
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){
// you can check for enter key here
}
public void onTextChanged (CharSequence s, int start, int before,int count) {
}
};
EditText et = (EditText) findViewById(R.id.YOUR_EDITTEXT_ID);
et.addTextChangedListener(tw);
Ответ 2
Вы имели в виду использовать setOnKeyListener()?
http://developer.android.com/reference/android/view/View.html#setOnKeyListener(android.view.View.OnKeyListener)
http://developer.android.com/reference/android/view/View.OnKeyListener.html
editText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
Log.i("KEY", Integer.toString(keyCode));
return false;
}
});
Ответ 3
Потому что, поскольку вы возвращаете false из вашего метода onKeyUp, в android, в частности, операции обрабатываются после метода onKeyUp.
Кроме того, вместо использования KeyListener большинство действий имеют метод onKeyUp, который вы можете переопределить.
Вот пример моего кода, над которым я работал.
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_TAB) editText1.tab();
if(event.isCtrlPressed())
{
if(keyCode == KeyEvent.KEYCODE_O) // ctrl+o
{
onClick(open);
}
else if(keyCode == KeyEvent.KEYCODE_N) // ctrl+n
{
addFileTab(null); // add untitled tab
editText1.setText("");
}
else if(keyCode == KeyEvent.KEYCODE_A) // ctrl+a
{
editText1.selectAll();
}
else if(keyCode == KeyEvent.KEYCODE_S) // ctrl+s
{
onClick(save);
}
else if(keyCode == KeyEvent.KEYCODE_C) // ctrl+c
{
String selected = editText1.selection();
ClipData clip;
if(current != null)
clip = ClipData.newPlainText(current.getName() + " selection", selected);
else
clip = ClipData.newPlainText("Cerulean selection", selected);
clipMan.setPrimaryClip(clip);
}
else if(keyCode == KeyEvent.KEYCODE_P && clipMan.hasPrimaryClip()) // ctrl+p
{
if(clipMan.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))
{
CharSequence clip = clipMan.getPrimaryClip().getItemAt(0).coerceToText(getBaseContext());
editText1.insert(clip.toString());
}
}
return false;
}
if(keyCode == KeyEvent.KEYCODE_SPACE || keyCode == KeyEvent.KEYCODE_ENTER)
{
onTabClicked(current, curTab);
}
return super.onKeyUp(keyCode, event);
}
Я называю суперклассы onKeyUp для всего остального. Надеюсь, это поможет кому-то.
-c
UPDATE: только эта аппаратная клавиатура ручного управления, для других операций используется TextWatcher.