Android: почему мой OnKeyListener () не вызывается? - PullRequest
22 голосов
/ 13 сентября 2010

Я определил поле 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 - действительно крутой зверь!

Ответы [ 3 ]

18 голосов
/ 13 сентября 2010

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

7 голосов
/ 14 июля 2012

У меня была точно такая же проблема, но только в одном из моих приложений 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

1 голос
/ 13 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...