Причина в том, что ваши менеджеры могут вводить фокус только в двух направлениях. Для HorizontalFieldManager
- левый и правый, а VerticalFieldManager
- верх и низ. Когда вы перемещаетесь в своем горизонтальном менеджере слева, вы перемещаетесь в направлении -1. Затем это передается вашему вертикальному менеджеру, где -1 означает, что он получает фокус снизу. Аналогично, когда вы двигаетесь вправо, он находится в направлении +1 и фокусируется сверху.
Лучшая ставка для вас - послушать движение навигации (на горизонтальном менеджере), а затем программно настроить правильное поле.
HorizontalFieldManager horManager = new HorizontalFieldManager(NO_HORIZONTAL_SCROLL | NO_VERTICAL_SCROLL | USE_ALL_WIDTH | USE_ALL_HEIGHT)
{
protected boolean navigationMovement(int dx, int dy, int status, int time)
{
if(dx > 0 && leftManager.isFocus()) // Moved right from the left manager
{
int index = leftManager.getFieldWithFocusIndex();
rightManager.getField(index).setFocus();
return true;
}
else if(dx < 0 && rightManager.isFocus())// Moved left from the right manager
{
int index = rightManager.getFieldWithFocusIndex();
leftManager.getField(index).setFocus();
return true;
}
return super.navigationMovement(dx, dy, status, time);
}
};
Предполагается, что оба вертикальных менеджера содержат одинаковое количество полей и только два столбца. Но с небольшой работой вы можете заставить этот метод обрабатывать динамическое число вертикальных менеджеров и полей.