Подтвердить что ты не робот

Android: почему мой OnKeyListener() не вызван?

Я определил поле EditText, и я хочу получать информацию, когда пользователь редактирует эти поля. Поэтому я подумал: просто - я добавляю OnKeyListener, и поэтому я это сделал. Но даже если текстовое поле редактируется (и даже отображает введенный/измененный текст), я не получаю никакого обратного вызова, т.е. Выход LOG не отображается.

    TextView text = new TextView(this);
    text.setText(...);
    ...
    text.setOnKeyListener(new OnKeyListener()
    {                           
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            TextView tv = (TextView)v;
            CharSequence val = tv.getText();
            Log.v(TAG, "value: " + val);
            // ... rest omitted for brevity
        }
    });

Любая идея, почему этот обратный вызов никогда не вызывается?

Майкл

PS: Вздох! Android действительно полон странностей! Кажется, что почти ничего, к чему я дотронулся до сих пор, работал незамедлительно, как и следовало ожидать. И - верьте или нет - у меня есть много опыта с графическими интерфейсами, особенно. в Java (AWT, Swing, SWT, вы называете это...) Но Android - действительно крутой зверь!

4b9b3361

Ответ 1

Используете ли вы мягкую клавиатуру (ime) для ввода текста редактирования? Я считаю, что onKeyListener запускается только с событиями с аппаратной клавиатуры. Вам лучше использовать TextWatcher, если сможете. onKeyListener не работает с мягкой клавиатурой (Android)

Ответ 2

У меня была такая же проблема, но только на одном из моих приложений для Android, и я никогда не выяснял, в чем разница.

Моим решением было сделать то, что предложил Майра, и добавить TextWatcher для обработки событий TextChanged. Поэтому он работает независимо от того, как происходит запись текста.

editName.addTextChangedListener(new TextWatcher () {
        public void afterTextChanged(Editable s) {
            Button btnSave = (Button)findViewById(R.id.btnSaveToon);
            if(s.length() > 0)
                btnSave.setEnabled(true);
            else
                btnSave.setEnabled(false);
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // TODO Auto-generated method stub
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
        }

    });

Работает как шарм в эмуляторе и на моем HTC Inspire

Ответ 3

Вы говорите, что имеете дело с EditText, но ваш код относится к TextView. Я предполагаю, что у вас есть EditText в ваших XML файлах макета, но вы имеете в виду этот недавно созданный TextView в своем коде, который на самом деле даже не в интерфейсе приложения вообще.

Если в вашем XML файле макета уже есть EditText, вам нужно получить указатель на него в вашем Java-коде, возможно, используя метод findViewById(). Затем добавьте свой OnKeyListener в этот EditText.

Определение вашего макета в XML на самом деле имеет гораздо больший смысл (по крайней мере во многих случаях, если не в большинстве случаев), чем определение его по одному компоненту за раз, а затем добавление каждого из этих компонентов в пользовательский интерфейс, как и в Swing. Но для этого нужно привыкнуть, не вопрос.