Blackberry: Как правильно обрабатывать обход фокуса в настраиваемом поле? - PullRequest
1 голос
/ 20 апреля 2010

Я пишу приложение для Blackberry, и у меня следующая проблема:

Я реализовал пользовательское поле, расширив класс Manager. Поле довольно простое, оно состоит из метки и двух флажков, да и нет. Поля расположены так, чтобы метка находилась слева и занимала как можно больше места, при этом оставляя место для флажков, расположенных рядом друг с другом справа и по центру по вертикали по сравнению с меткой (если она охватывает более одной строки). Так это выглядит так:

Это вопрос? O Да O Нет

Пока все хорошо с точки зрения разбивки полей. Но сейчас я пытаюсь справиться с обходом фокуса. Во-первых, поведение по умолчанию, когда пользователь прокручивает вверх или вниз, заключается в переключении между параметрами «да» и «нет». Я хочу перейти к следующему полю выше или ниже при нажатии вверх или вниз, поэтому я сделал это:

protected int moveFocus(int amount, int status, int time) {
    if (status == 537001984 || status == -1610481664) { // Up or down was pressed
        // Don't move focus between yes and no when up or down is pressed.
        return amount;
    }
    return super.moveFocus(amount, status, time);
}

И это похоже на работу.

Следующее, что я хотел бы сделать, это вспомнить, какая опция в последний раз имела фокус, когда поле теряет фокус, затем снова получить фокус (независимо от того, в каком направлении идет фокус), установить в этом поле фокус. Я попытался переопределить onUnfocus и onFocus так, чтобы при unfocus я отмечал, какое поле было сфокусировано, а затем при фокусировке устанавливал фокус на это поле. Но я получаю StackOverflowError, я полагаю, потому что вызов setFocus для поля внутри менеджера фактически снова вызывает onFocus для самого менеджера ??

Так кто-нибудь знает, как я должен это делать? Я проверил DateField, и он работает точно так же, как и я, т. Е. Он запоминает, были ли вы последними в поле дня, месяца или года, и устанавливает это поле в фокус, когда само поле получает фокус.

1 Ответ

2 голосов
/ 20 апреля 2010

Когда мне нужно исправить фокус внутри onFocus, я использую некоторый флаг:

boolean isCustomFocusSet = false;

protected void onFocus(int direction) {
    if (!isCustomFocusSet) {            
        isCustomFocusSet = true;
        int fieldIndex = getLastFocusedCBIndex();
        CustomField field = (CustomField)getField(fieldIndex);
        field.setFocus();
    } else {
        isCustomFocusSet = false;
        super.onFocus(direction);           
    }
}   

UPDATE Для CustomField это может решить вызвать this.onFocus вместо super.onFocus:

CustomField field = (CustomField)getField(fieldIndex);
...