Blackberry 滚动问题-很难“解决”;到达";屏幕底部的字段

Blackberry 滚动问题-很难“解决”;到达";屏幕底部的字段,blackberry,Blackberry,我遇到了一个奇怪的问题:我的屏幕正在使用默认的VerticalFieldManager。。。。超级(使用所有宽度、使用所有高度)。。。。。在此,我们添加了24个附加字段。这些附加字段的类型为RichTextField、NullField、TextField和ObjectChoiceField。这个屏幕有效地只是一个积垢的形式。。。用于输入要发送到后端服务器的数据 有趣的是,我不能使用小触控板(真正的设备和模拟器是9850 Torch 2)向下导航到屏幕底部的字段。由于它是一款基于触摸的设备,我可

我遇到了一个奇怪的问题:我的屏幕正在使用默认的VerticalFieldManager。。。。超级(使用所有宽度、使用所有高度)。。。。。在此,我们添加了24个附加字段。这些附加字段的类型为RichTextField、NullField、TextField和ObjectChoiceField。这个屏幕有效地只是一个积垢的形式。。。用于输入要发送到后端服务器的数据

有趣的是,我不能使用小触控板(真正的设备和模拟器是9850 Torch 2)向下导航到屏幕底部的字段。由于它是一款基于触摸的设备,我可以向上“拖动”屏幕,以显示位于底部的字段,但只有在虚拟键盘显示之后

根据MainManager.getVirtualHeight()方法,我的虚拟高度是970像素,可见高度是800(Torch 2)。对于初始“可视内容区域”下方的字段,需要滚动才能到达,我无法使用触摸板将焦点放在屏幕下边缘下方的其中一个文本字段中。。。。。事实上,我可能可以将焦点放在那里,但屏幕仍然没有向上滚动那些较低的字段,以便用户可以看到它们

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

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 );
。。。。。希望这能解决问题,但没什么区别


谢谢

我在OS6+上看到过这个问题,当屏幕上有大文本字段时,尤其是当单个文本字段比屏幕本身高时。如果您将textfield分解为多个较小的字段,它应该会有所帮助

编辑:
或者,您可以编写自己的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);
    }
}
公共类MyVerticalFieldManager扩展管理器{
受保护的MyVerticalFieldManager(长样式){
超级(
风格|
((style&Manager.VERTICAL\u SCROLL\u MASK)=0?Manager.VERTICAL\u SCROLL:0)|
((style&Manager.VERTICAL\u SCROLLBAR\u MASK)=0?Manager.VERTICAL\u SCROLLBAR:0));
}
受保护的空位子布局(整数宽度、整数布局宽度){
int height=整数最大值;
int-lastY=0;
int lastBottomMargin=0;
final int fieldCount=this.getFieldCount();
对于(int i=0;i
我在OS6+上看到过这个问题,当屏幕上有大文本字段时,尤其是当单个文本字段比屏幕本身高时。如果您将textfield分解为多个较小的字段,它应该会有所帮助

编辑:
或者,您可以编写自己的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);
    }
}
公共类MyVerticalFieldManager扩展管理器{
受保护的MyVerticalFieldManager(长样式){
超级(
风格|
((style&Manager.VERTICAL\u SCROLL\u MASK)=0?Manager.VERTICAL\u SCROLL:0)|
((style&Manager.VERTICAL\u SCROLLBAR\u MASK)=0?Manager.VERTICAL\u SCROLLBAR:0));
}
受保护的空位子布局(整数宽度、整数布局宽度){
int height=整数最大值;
int-lastY=0;
int lastBottomMargin=0;
final int fieldCount=this.getFieldCount();
对于(int i=0;i
好的。。经过反复试验,我做了一些事情(完全绝望),成功了!这太愚蠢了,如果不是因为其他人可能有同样的问题,我会把这件事留给自己

我只是创建了一个VerticalFieldManager,将所有字段添加到其中,然后将VFM添加到屏幕上。事实上,这不会有任何区别,因为屏幕上的默认管理器是VFM。没有别的了。没有其他属性集、调用的方法、事件。。。。娜达


想想看。

好的。。经过反复试验,我做了一些事情(完全绝望),成功了!这太愚蠢了,如果不是因为其他人可能有同样的问题,我会把这件事留给自己

我只是创建了一个VerticalFieldManager,并添加了