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!

Другие вопросы по тегам