我正在为 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 以便 onUnfocus 我注意到哪个字段被聚焦,然后 onFocus setFocus 到该字段。但是我得到了一个 StackOverflowError,我猜是因为在管理器中对一个字段的 setFocus 调用实际上再次为管理器本身调用了 onFocus?
那么有人知道我应该怎么做吗?我检查了 DateField 并且它具有我正在寻找的确切行为,即它会记住您是否最后在日、月或年字段中,并在字段本身获得焦点时将此字段设置为焦点。