Почему навигация по FOCUSABLE LabeField обходит стороной в Blackberry?

У меня есть LabelField со стилем FOCUSABLE и много фокусируемых полей после него, и я переопределил метод navigationMovement объекта LabelField.

Проблема в том, что код никогда не входит в новую реализацию navigationMovement, но фокус обычно перемещается из LabelField в следующее поле без передачи реализацией navigationMovement!

PS, я также протестировал использование отладчика, чтобы убедиться, что он никогда не попадет в его реализацию.

Почему это происходит и как перехватить событие navigationMovement для FOCUSABLE LabelField?

КОД:
Вот класс:

public abstract class FocusableLabelField extends LabelField {
public boolean isDownUnfocused = false;

public FocusableLabelField(String text) {
    super(text, FOCUSABLE);
}

protected void drawFocus(Graphics graphics, boolean on) {
        // DO NOTHING, FOCUS IS HANDLED IN PAINT
}

protected void paint(Graphics graphics) {
    if(isDownUnfocused == true)
        graphics.setColor(0xFFFFFF);
    else {
        if(isFocus())
            graphics.setColor(0xFFFFFF);
        else {
            graphics.setColor(0x777777);
        }
    }
    super.paint(graphics);
}

protected void onFocus(int direction) {
    isDownUnfocused = false;
    onFocusing();
    super.onFocus(direction);
}

public abstract void onFocusing();

public void redraw() {
    invalidate();
}

protected boolean navigationMovement(int dx, int dy, int status, int time) {
    //TODO CHECK WHY IT'S NOT ENTERING HERE !
    if(dy>0)
        isDownUnfocused = true;
    invalidate(); // IF REMOVED NO EFFECT WILL BE APPLIED
    return super.navigationMovement(dx, dy, status, time);
}
}

И вот как я использую это на экране:

FocusableLabelField field = new FocusableLabelField("title") {
    public void onFocusing() {
        // some logic in the screen is done here ...
    }
} ;

1 ответ

Я только что запустил ваш точный код в приложении на симуляторе 5.0 8900 и симуляторе 7.1 9900, и я увидел ваш navigationMovement() называется. Однако я не уверен на 100%, что его вызывают, когда вы этого хотите.

Я не знаю точно, что вы пытаетесь сделать, но, глядя на код выше, похоже, что вы просто пытаетесь добавить пользовательский рисунок для цветов фокуса. Это правильно?

Если это так, я не знаю точно, почему вам нужно переопределить navigationMovement(), Почему бы не использовать такой код:

public abstract class FocusableLabelField extends LabelField {

   public FocusableLabelField(String text) {
      super(text, FOCUSABLE);
   }

   protected void drawFocus(Graphics graphics, boolean on) {
      // DO NOTHING, FOCUS IS HANDLED IN PAINT
   }

   protected void paint(Graphics graphics) {  
      int oldColor = graphics.getColor();
      if(isFocus())
         graphics.setColor(0xFFFFFF);
      else {
         graphics.setColor(0x777777);
      }
      super.paint(graphics);
      graphics.setColor(oldColor);
   }

   protected void onFocus(int direction) {
      onFocusing();
      invalidate();
      super.onFocus(direction);
   }

   protected void onUnfocus() {
      invalidate();
      super.onUnfocus();
   }

   public abstract void onFocusing();
}
Другие вопросы по тегам