我有一个VerticalFieldManager的自定义扩展,它自动滚动自己以向用户显示数据。在VFM的上方和下方,都有用户可以与之交互的其他组件。在OS5上,这完美而且完全符合我的预期。在OS6上,通过内置的“平滑滚动”功能,当用户尝试从VFM上方的字段滚动到下面的字段时,在将焦点转移到VFM下方的字段之前,用户的输入会滚动VFM。 / p>
有没有办法覆盖这种行为并告诉操作系统单独离开我的VFM?在OS5中,这很简单,因为VFM不可聚焦。
我试图摆弄VFM上的垂直调整和垂直量化而没有运气。 VFM从未真正获得焦点,操作系统只是滚动它。我认为操作系统认为它有用,但事实并非如此! :)
答案 0 :(得分:1)
你可能会在父管理器中弄乱nextFocus()
,只是跳过中间的VFM。也许还会覆盖中间的onFocus()
以便进入下一个。我知道应该通过将其设置为不可聚焦来执行此操作,但可能会覆盖isFocusable()
以返回false。
答案 1 :(得分:1)
我通过覆盖父管理器中的navigationMovement
函数找到了一个解决方案,如下所示:
protected boolean navigationMovement(int dx, int dy, int status, int time) {
if (getField(getFieldWithFocusIndex()) == tabbar) {
Field f = tabbar.getFieldWithFocus();
if (f == lastTabButton) {
if (dy > 0) {
tabData.setFocus();
return true;
}
} else if (f == firstTabButton) {
if (dy < 0) {
return true;
}
}
} else if (getField(getFieldWithFocusIndex()) == tabData) {
MyTab tab = (MyTab) tabs.get(tabData);
if (tab != null && !tab.willHandleNavigationMovement(dx, dy)) {
if (dy != 0) {
if (dy < 0)
lastTabButton.setFocus();
return true;
}
}
}
return super.navigationMovement(dx, dy, status, time);
}
您将在上面的代码中看到,我必须覆盖从最顶部向上滚动并从最底部向下滚动时的行为,因为操作系统再次接管并“帮助”我滚动不可聚焦的VFM