如何在OS 6中覆盖默认滚动行为

时间:2011-08-11 14:41:34

标签: blackberry

我有一个VerticalFieldManager的自定义扩展,它自动滚动自己以向用户显示数据。在VFM的上方和下方,都有用户可以与之交互的其他组件。在OS5上,这完美而且完全符合我的预期。在OS6上,通过内置的“平滑滚动”功能,当用户尝试从VFM上方的字段滚动到下面的字段时,在将焦点转移到VFM下方的字段之前,用户的输入会滚动VFM。 / p>

有没有办法覆盖这种行为并告诉操作系统单独离开我的VFM?在OS5中,这很简单,因为VFM不可聚焦。

我试图摆弄VFM上的垂直调整和垂直量化而没有运气。 VFM从未真正获得焦点,操作系统只是滚动它。我认为操作系统认为它有用,但事实并非如此! :)

2 个答案:

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