moveFocus не вызывается
У меня есть настраиваемое поле списка объектов с реализованной подпрограммой прокрутки.
public int moveFocus(int amount, int status, int time) {
invalidate(getSelectedIndex());
int unused = super.moveFocus(amount, status, time);
return Math.abs(unused) + 1;
}
public boolean navigationMovement(int dx, int dy, int status, int time) {
if (dy > 0) {
if (selectedIndex < getSize() - 1) {
setSelectedIndex(selectedIndex + 1);
}
} else if (dy < 0) {
if (selectedIndex > 0) {
setSelectedIndex(selectedIndex - 1);
}
}
return true;
}
Прокрутка работает нормально, когда я выполняю прокрутку с помощью trackwheel, но прерывается, когда приложение запускается на устройстве с трекболом. Я понял, что проблема заключается в методе Framework MoveFocus, который вообще не вызывается при прокрутке с помощью трекбола.
1 ответ
Проблема была решена путем изменения return true;
в return false;
в navigationMovement
метод. Это хороший пример ошибочного дизайна API. Когда вы видите некоторый метод обработки событий графического интерфейса, такой как этот, возвращающий логическое значение, ваше первое и единственное предложение состоит в том, что возвращаемое значение означает, что событие было использовано. Но в случае navigationMovement
метод ты не прав. Вот выдержка из JDE 4.2.1 javadoc
Параметры: dx - Величина навигационного движения: отрицательная для движения влево и положительная для движения вправо. dy - Величина навигационного движения: отрицательная для движения вверх и положительная для движения вниз. status - Битовое поле значений, определенных KeypadListener. время - количество миллисекунд с момента включения устройства.
Returns: False (классы, расширяющие Field, должны переопределять этот метод для обеспечения определенной обработки).
Браво RIM!