专注于ListField?

时间:2010-10-14 07:04:10

标签: blackberry

我在屏幕上添加了两个列表字段 但是在焦点变化时,它不会横向进入第二个列表。

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 个答案:

答案 0 :(得分:2)

当在两个水平管理器中组织4个字段时,我们遇到了类似的问题。从 upper 右侧字段向下滚动,我们将 upper 向左,而不是 bottom 向右,因为移动首先在水平管理器内滚动。

我们最终实现了我们自己的管理器,用于添加和定位字段(而不是水平管理器),然后覆盖管理器的navigationMovement功能,如this tutorial中所述,以控制哪个字段获取重点取决于运动。例如:

if (dx < 0)
{
    getField(focusedIndex - 1).setFocus();
}

基本上dx为正/负,具体取决于水平线的移动,dy为正/负,具体取决于垂直线的移动。

希望这会有所帮助,如果你找到一个更好的方法,我会非常乐意去了解它,因为这很麻烦......

编辑 - 代码:我添加了一些代码示例,但是我们只有4个按钮,因此导航与您要查找的不同。我们在屏幕中创建管理器并向其添加每个字段,并将管理器添加到屏幕。我们在Manager,sublayout和navigationMovement中覆盖了2个方法。

sublayout函数负责布局你的按钮,注意你必须明确设置x和y位置,最好在确定位置时使用Display.getWidth,这样它在不同的屏幕上保持相同的比例。

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);
}

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而不更改焦点,例如,当从最左边的字段向左移动时,您可能希望保持在同一个字段而不是环绕。

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 :(得分:1)

还有另一种解决方案,您可以使用任何管理器构造:

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;
        }
    }

但在这种情况下,你需要为每个可以对付的字段执行此操作