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 - действительно крутой зверь!
Ответы
Ответ 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. Но для этого нужно привыкнуть, не вопрос.