滚动问题 - 很难“到达”屏幕底部的字段

时间:2011-11-19 15:13:06

标签: blackberry

我遇到一个奇怪的问题:我有一个使用默认VerticalFieldManager ....的屏幕(USE_ALL_WIDTH | USE_ALL_HEIGHT); .....我们添加了24个额外的字段。这些附加字段的类型为RichTextField,NullField,TextField和ObjectChoiceField。这个屏幕只是一个有效的CRUD表单...用于输入要发送到后端服务器的数据。

有趣的是,我无法使用小型TrackPad(真实设备和模拟器是9850 Torch 2)来向下导航到屏幕底部的字段。由于它是基于触控的设备,我可以向上“拖动”屏幕以显示位于底部但仅在显示虚拟键盘之后的字段。

根据MainManager.getVirtualHeight()方法,我的虚拟高度为970像素,可见高度为800(火炬2)。在初始“可查看内容区域”下方的字段,并且需要滚动才能到达,我无法使用触控板将焦点放置在屏幕下边缘下方的其中一个TextField中.....点事实上,我可能可以将焦点放在那里,但屏幕仍然不会向上滚动那些较低的字段,以便用户可以看到它们。

这是一个非常简单的实现:

public class GetDataScreen extends MainScreen .....

public GetDataScreen()
{
    super( MainScreen.USE_ALL_WIDTH | MainScreen.USE_ALL_HEIGHT );

    add( field1 );
    add( field2 );
    ....
    ...
    ..
    .
}

有关导致此问题或如何解决问题的任何想法?为了记录,我也试着打电话:

super( MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR | MainScreen.USE_ALL_WIDTH | MainScreen.USE_ALL_HEIGHT );

.....希望能解决它,但它没有任何区别。

由于

2 个答案:

答案 0 :(得分:2)

好的..在经过一系列的试验和错误之后我做了一些事情(完全绝望)并且它有效!这太愚蠢了,如果不是因为其他人可能会遇到同样的问题,我会自己保留这个......

我只是创建了一个我添加了所有字段的VerticalFieldManager,然后将该VFM添加到屏幕。事实上,这根本不应该有任何区别 - 因为屏幕上的默认管理器是VFM。没有其他的。没有其他属性设置,方法调用,事件.... nada。

去图。

答案 1 :(得分:1)

当你在屏幕上有大型TextFields时,我在OS6 +上看到了这个问题 - 特别是当单个文本字段高于屏幕本身时。如果将文本字段拆分为多个较小的字段,则应该有所帮助。

编辑:
或者,您可以编写自己的VerticalFieldManager,这是我使用的最终解决方案。我有一些定制,但核心布局并不像你想象的那么复杂。这不会对子字段进行左/右/中心对齐,但如果需要,可以轻松添加它。

public class MyVerticalFieldManager extends Manager {
    protected MyVerticalFieldManager(long style){
        super(
           style |
           ((style & Manager.VERTICAL_SCROLL_MASK) == 0 ? Manager.VERTICAL_SCROLL : 0) |
           ((style & Manager.VERTICAL_SCROLLBAR_MASK) == 0 ? Manager.VERTICAL_SCROLLBAR : 0));
    }

    protected void sublayout(int width, int layoutHeight) {
        int height = Integer.MAX_VALUE;
        int lastY = 0;
        int lastBottomMargin = 0;
        final int fieldCount = this.getFieldCount();
        for(int i = 0; i < fieldCount; i++) {
            Field f = this.getField(i);
            int margin = Math.max(lastBottomMargin, f.getMarginTop());
            final int x = f.getMarginLeft();
            final int y = lastY + margin;
            final int maxWidth = width-(f.getMarginLeft()+f.getMarginRight());
            final int maxHeight = height - y;
            this.layoutChild(f, maxWidth, maxHeight);
            this.setPositionChild(f, x, y);
            lastY = y + f.getHeight();
            lastBottomMargin = f.getMarginBottom();
        }
        this.setVirtualExtent(width, lastY + lastBottomMargin);
        this.setExtent(width, layoutHeight);
    }
}