我正在为Blackberry编写应用程序,我遇到以下问题:
我通过扩展Manager类实现了自定义字段。该字段非常简单,它由一个标签和两个复选框组成,是和否。字段的布局使得标签位于左侧并尽可能多地使用空间,同时仍然为复选框留出空间,复选框位于右侧并且垂直居中,与标签相比(如果它跨越)超过一行)。所以它看起来像这样:
这是一个问题? O是O否
到目前为止,在铺设田地方面一切都很好。但现在我正在尝试处理焦点遍历。首先,当用户向上或向下滚动时的默认行为是在yes和no选项之间移动。当按下向上或向下时,我想移动到上方或下方的下一个字段,所以我这样做了:
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并且它具有我正在寻找的确切行为,即它记住你是否是日,月或年字段的最后一个,并且当字段本身获得焦点时将此字段设置为焦点。
答案 0 :(得分:2)
当我需要在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);
}
}
<强>更新强> 对于CustomField,这可能会解析为调用this.onFocus而不是super.onFocus:
CustomField field = (CustomField)getField(fieldIndex);