首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ListField中聚焦?

在ListField中聚焦?
EN

Stack Overflow用户
提问于 2010-10-14 15:04:10
回答 2查看 1.2K关注 0票数 1

我已经在一个屏幕上添加了两个列表字段,但在焦点改变时,它不会水平地转到第二个列表。

代码语言:javascript
复制
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上,它水平移动。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-15 04:30:17

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

我们最终实现了我们自己的管理器来添加和定位字段(而不是水平管理器),然后覆盖管理器的navigationMovement函数,就像this tutorial中解释的那样,根据移动来控制哪个字段获得焦点。例如:

代码语言:javascript
复制
if (dx < 0)
{
    getField(focusedIndex - 1).setFocus();
}

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

希望这对你有帮助,如果你找到更好的方法,我会很高兴了解它,因为这是相当繁琐的…

编辑代码:我添加了一些代码示例,但是我们只有4个按钮,所以导航与您正在寻找的不同。我们在屏幕中创建管理器,并将每个字段添加到其中,然后将管理器添加到屏幕中。我们在管理器中有两个方法,sublayout和navigationMovement。

子布局功能负责布局你的按钮,注意你必须显式地设置x和y位置,这是一个好主意,当确定位置时使用Display.getWidth,这样它在不同的屏幕上保持相同的比例。

代码语言:javascript
复制
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而不更改焦点,例如,当从最左边的字段向左移动时,您可能希望停留在相同的字段上,而不是环绕。

代码语言:javascript
复制
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;
}

我希望这能有所帮助:)

票数 2
EN

Stack Overflow用户

发布于 2011-11-29 12:22:22

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

代码语言:javascript
复制
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;
        }
    }

但在这种情况下,您需要为每个可用字段执行此操作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3930828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档