Я пишу приложение для 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, и он работает точно так же, как и я, т. Е. Он запоминает, были ли вы последними в поле дня, месяца или года, и устанавливает это поле в фокус, когда само поле получает фокус.