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


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上,它水平移动。
发布于 2010-10-15 04:30:17
当将4个字段组织在两个水平管理器中时,我们遇到了类似的问题。从右上角向下滚动将我们带到左上角,而不是右下角,因为移动首先在水平管理器内滚动。
我们最终实现了我们自己的管理器来添加和定位字段(而不是水平管理器),然后覆盖管理器的navigationMovement函数,就像this tutorial中解释的那样,根据移动来控制哪个字段获得焦点。例如:
if (dx < 0)
{
getField(focusedIndex - 1).setFocus();
}基本上,dx是正/负取决于水平线上的移动,而dy是正/负取决于垂直线上的移动。
希望这对你有帮助,如果你找到更好的方法,我会很高兴了解它,因为这是相当繁琐的…
编辑代码:我添加了一些代码示例,但是我们只有4个按钮,所以导航与您正在寻找的不同。我们在屏幕中创建管理器,并将每个字段添加到其中,然后将管理器添加到屏幕中。我们在管理器中有两个方法,sublayout和navigationMovement。
子布局功能负责布局你的按钮,注意你必须显式地设置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);
}
对于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;
}
我希望这能有所帮助:)
发布于 2011-11-29 12:22:22
还有另一种解决方案,您可以使用任何管理器构造:
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;
}
}但在这种情况下,您需要为每个可用字段执行此操作
https://stackoverflow.com/questions/3930828
复制相似问题