Проблема с Android EditText: KeyListener - PullRequest
11 голосов
/ 29 июня 2011

В компоненте EditText я пытаюсь установить KeyListener, чтобы перехватить клавишу ВВОД (для проверки формы).

    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 с помощью клавиатуры все клавиши игнорируются, и это игнорирует мои нажатия клавиш.Однако софтпад на устройстве эмулятора работает.

Как это исправить, пожалуйста?

Ответы [ 3 ]

30 голосов
/ 29 июня 2011

Я бы использовал класс 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 голосов
/ 24 июня 2012

Вы хотели использовать 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;
    }
});
0 голосов
/ 09 апреля 2014

Это потому, что вы возвращаете 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

ОБНОВЛЕНИЕ: Это обрабатывает только аппаратные клавиатуры, для других операций используйте TextWatcher.

...