moveFocus не вызывается - PullRequest
       19

moveFocus не вызывается

2 голосов
/ 08 октября 2009

У меня есть настраиваемое поле списка объектов с реализованной процедурой прокрутки.

 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;
 }    

Прокрутка работает нормально, когда я выполняю прокрутку с помощью треквилла, но прерывается, когда приложение запускается на устройстве с трекболом. Я понял, что проблема заключается в framework метод moveFocus, который вообще не вызывается при прокрутке с помощью трекбола.

1 Ответ

1 голос
/ 08 октября 2009

Проблема устранена путем изменения return true; на return false; в методе navigationMovement. Это хороший пример ошибочного дизайна API. Когда вы видите какой-либо метод обработки событий графического интерфейса, такой как этот, возвращающий логическое значение, ваше первое и единственное предложение состоит в том, что возвращаемое значение означает , событие было использовано . Но в случае navigationMovement метода вы ошибаетесь. Вот выдержка из JDE 4.2.1 javadoc


Параметры: dx - Величина навигационного движения: отрицательная для движения влево и Позитив для движения вправо. dy - Величина навигационного движения: отрицательная для движения вверх, и положительный для нисходящего движения. status - Битовое поле значений, определенных KeypadListener. время - количество миллисекунд с момента включения устройства.

Returns : False (классы, расширяющие Field, должны переопределить этот метод, чтобы обеспечить специфическая обработка).

Bravo RIM!

...