Мы столкнулись с подобной проблемой, когда 4 поля были организованы в двух горизонтальных менеджерах. Прокрутка вниз от верхнего правого поля привела нас к верхнему влево, а не к низу вправо, поскольку движение сначала прокручивалось внутри горизонтального менеджера.
В итоге мы реализовали наш собственный менеджер для добавления и позиционирования полей (вместо горизонтальных менеджеров), а затем переопределили функцию navigationMovement менеджера, как описано в в этом уроке , контролировать, какое поле получает фокус в зависимости от движения. Например:
if (dx < 0)
{
getField(focusedIndex - 1).setFocus();
}
В основном dx
является положительным / отрицательным в зависимости от движения по горизонтальной линии, а dy
является положительным / отрицательным в зависимости от движения по вертикальной линии.
Надеюсь, это поможет, если вы найдете лучший способ, я был бы очень рад узнать об этом, так как это довольно громоздко ...
EDIT - CODE: я добавил пример кода, однако у нас есть только 4 кнопки, поэтому навигация отличается от того, что вы ищете. Мы создаем менеджера на экране и добавляем каждое поле к нему, а также добавляем менеджера на экран. У нас есть 2 метода, которые мы переопределяем в Manager, sublayout и navigationMovement.
Функция sublayout отвечает за разметку ваших кнопок, обратите внимание, что вам нужно явно установить положение x и y, это хорошая идея, чтобы использовать Display.getWidth при определении положения, чтобы она сохраняла одинаковые пропорции на разных экранах ,
</p>
<pre><code>protected void sublayout(int width, int height)
{
int count = getFieldCount();
Field field;
for (int i = 0; i < count; i++)
{
field = getField(i);
layoutChild(field, field.getWidth(), field.getHeight());
setPositionChild(field, xPositionOfButton, yPositionOfButton);
}
setExtent(width, height);
}
Для navigationMovement используйте значения dx и dy и индекс поля, в котором в данный момент находится фокус, чтобы определить следующее поле для получения фокуса. Если не должно быть изменения фокуса, просто верните false, не меняя фокуса, например, при перемещении влево от крайнего левого поля вы, вероятно, захотите остаться на том же поле и не переходить в другое.
</p>
<pre><code>public boolean navigationMovement(int dx, int dy, int status, int time)
{
int focusedIndex = getFieldWithFocusIndex();
if (dx < 0)
{
getField(focusedIndex - 1).setFocus();
}
else if (dx > 0)
{
getField(focusedIndex + 1).setFocus();
}
else if (dy < 0)
{
getField(focusedIndex - 2).setFocus();
}
else if (dy > 0)
{
getField(focusedIndex + 2).setFocus();
}
else
return false;
return true;
}
Надеюсь, это поможет:)