Honestly, to me, this seems like a bug. I don't think it should work this way. However, at this point, nothing in older BlackBerry Java devices is going to be fixed, so we just have to work around it.
The problem is that you have set your LabelField
to be non-focusable, but the device is ignoring that. It is opening your screen with focus on the GridFieldManager
, which just puts focus on its first field (the label). If the user moves focus onto the choice field, you won't be able to get focus back to the label field. But, I'm sure you don't want the screen opening with focus on something non-focusable.
You can either just set focus manually to the choice field:
//grid.add(lol);
grid2.add(new LabelField("Productos_", NON_FOCUSABLE));
grid2.add(menu);
menu.setFocus();
or, if you want to handle this more generically, you can write your own method to initialize the focus to the first field that's really focusable:
public class LabelFocusScreen extends MainScreen {
public LabelFocusScreen() {
super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);
setTitle("GridFieldManager");
GridFieldManager grid2 = new GridFieldManager(1,2,GridFieldManager.FIXED_SIZE);
add(grid2);
String[] choice={"1","2","0"};
ObjectChoiceField menu=new ObjectChoiceField(null,choice);
//grid.add(lol);
grid2.add(new LabelField("Productos_", NON_FOCUSABLE));
grid2.add(menu);
initializeFocus(this);
}
/** @return true if focus was set within the given field */
private boolean initializeFocus(Field f) {
boolean focusSet = false;
if (f instanceof Manager) {
Manager m = (Manager)f;
// loop over all child fields, recursively
for (int i = 0; i < m.getFieldCount(); i++) {
if (initializeFocus(m.getField(i))) {
focusSet = true;
break;
}
}
} else if (f.isFocusable()) {
f.setFocus();
focusSet = true;
}
return focusSet;
}
}
Both solutions should work for you.
Note: by the way, you don't have to actually set the LabelField
to be non-focusable. It will be non-focusable by default. It doesn't hurt. It's just not needed.
Update:
If you also want to be able to set focus back to grid2
later (after the screen first appears), you can also call my initializeFocus()
method again, to prevent any more problems with the non-focusable label gaining focus.
For example, make your screen implement FocusChangeListener
, and then in its constructor:
grid2.add(new LabelField("Productos_", NON_FOCUSABLE));
grid2.add(menu);
grid2.setFocusListener(this);
where the focus listener implementation includes this new method (in your screen class):
public void focusChanged(Field f, int event) {
if (event == FocusChangeListener.FOCUS_GAINED) {
initializeFocus(f);
}
}
This will allow initializeFocus()
to be called for the grid2
manager object, if focus is later set back to it. Calling initializeFocus()
, passing the grid field manager as the argument, will correctly set focus to its first focusable field.