Фокус в ListField? - PullRequest
       3

Фокус в ListField?

1 голос
/ 14 октября 2010

Я добавил два поля списка на экран но при изменении фокуса он не попадает во второй список по горизонтали.

alt text alt text

class TestScreen extends MainScreen {
         private final ObjectListField listField = new ObjectListField(FIELD_LEFT)
         {
             public void layout(int width, int height)
              {
                super.layout(width,height);
                setExtent(Display.getWidth()/2, Display.getHeight());
              }

         };
         private final ObjectListField listField2 = new ObjectListField(FIELD_RIGHT)
         {
             public void layout(int width, int height)
              {
                super.layout(width,height);
                setExtent(Display.getWidth()/2, Display.getHeight());
              }

         };
         private final String[] lines = { "Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6" };
         private final String[] lines2 = { "Line 10", "Line 20", "Line 30", "Line 40", "Line 50", "Line 60" };
         TestScreen() 
         {
                  super(NO_VERTICAL_SCROLL);
                  HorizontalFieldManager hfm=new HorizontalFieldManager(Manager.HORIZONTAL_SCROLL);
                  hfm.add(listField);
                  hfm.add(listField2);
                  listField.set(lines);
                  listField2.set(lines2);
                  add(hfm);

        }
}

Я хочу, чтобы в фокусе от списка 1 до списка 2 он двигался горизонтально.

Ответы [ 2 ]

2 голосов
/ 15 октября 2010

Мы столкнулись с подобной проблемой, когда 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; }

Надеюсь, это поможет:)

1 голос
/ 29 ноября 2011

есть другое решение, где вы можете использовать любые конструкции менеджера:

protected boolean navigationMovement(int dx, int dy,
            int status, int time) {

        Field focusedIndex = ThisScreen.getFieldWithFocus().getLeafFieldWithFocus();
        if (focusedIndex == YourFocusableField)
        { 
           //any needed settings here
           if (dx < 0)
           {
               anyField.setFocus();
           }
           else if (dx > 0)
           {
               anyField.setFocus();
           }
           else if (dy < 0)
           {
               anyField.setFocus();
           }
           else if (dy > 0)
           {
               anyField.setFocus();
           }
           else
              return false;

           return true;
        }
    }

но в этом случае вам нужно будет сделать это для каждого fucusable поля

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...