1

试图将 a 的高度DateField从默认的 53 降低到 32,但无济于事。高度保持不变,结果文本出现在高度较小的背景底部(32)。

我尝试了两种方法:

    DateField dtf = new DateField(label, defaultDateTime, DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE | Field.READONLY )
    {
        protected void layout(int width, int height)
        {
            Bitmap bmp = UIElements.GetBitmap(UIElements.IMG_DROPDOWN_BG, true);

            width = bmp.getWidth();
            height = bmp.getHeight();
            super.setExtent(width, height);

            super.layout(width, height);
        }           
    };

第二种方法(基于 Stack Overflow 帖子):

public class MyDateManager extends VerticalFieldManager {
    protected DateField dateField_ = null;
    public MyDateManager(String label, long defaultDateTime) {
        super(Manager.FIELD_HCENTER | Manager.FIELD_VCENTER);
        dateField_ = new DateField(label, defaultDateTime, DateField.DATE_TIME |
            Field.FIELD_HCENTER | DrawStyle.HCENTER | Field.FOCUSABLE | Field.READONLY);

        this.add(dateField_);
    }

    protected void sublayout(int width, int height) {
        Bitmap bmp = UIElements.GetBitmap(UIElements.IMG_DROPDOWN_BG, false);

        width = bmp.getWidth();
        height = bmp.getHeight();

        layoutChild(dateField_, width, height);
        dateField_.setBackground(BackgroundFactory.createBitmapBackground(bmp, 0, 0, Background.REPEAT_NONE));
        int h = dateField_.getHeight();
        setExtent(width, height);
    }
 }

请建议。

谢谢

4

2 回答 2

1

第二种方法是一种可怕的方法(弄乱 VerticalFieldManager 的高度会给你带来很多问题)。

再次尝试第一种方法,但这次super.layout先调用:

    DateField dtf = new DateField(label, defaultDateTime, DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE | Field.READONLY )
    {
        protected void layout(int width, int height) {
            super.layout(width, height);

            Bitmap bmp = UIElements.GetBitmap(UIElements.IMG_DROPDOWN_BG, true);

            width = bmp.getWidth();
            height = bmp.getHeight();
            super.setExtent(width, height);
        }           
    };

请注意,使用这种方法您也可能会遇到故障,因为您在不考虑类的其余部分的情况下盲目地覆盖一个方法。要安全地执行此操作,您需要访问父类源,而您没有。

我建议扩展HorizontalFieldManager(覆盖sublayout)以具有固定的高度(从不使用 VFM,因为滚动的方向与您尝试固定的方向相同)。然后放置在使用所有可用高度的常规日期字段中(Field.USE_ALL_HEIGHT在构造函数中传递标志)。

更多信息: http ://docs.blackberry.com/es-es/developers/deliverables/29251/Determining_the_dimensions_of_a_field_1578864_11.jsp

于 2013-11-07T12:12:04.227 回答
0

我怀疑这是一场你可能会失败的战斗。

就我个人而言,我会从 LabelField 创建一个 DateField 外观,它将为您提供所需的限制。

DateField 是一个专门的字段,在我的测试中,它将忽略您对其施加的限制,无论您是尝试通过包含管理器还是直接在字段的布局方法中执行此操作。似乎它将为自己选择的实际高度会因设备而异。

我怀疑在所有支持触摸屏的设备上,它都会尝试给自己足够的高度来触摸。就取决于设备分辨率 (dpi) 的像素而言,实际上您的图像应该如此,因为它在高分辨率设备(如 9900)和低分辨率设备(如 9300)上看起来会有所不同。

我怀疑在非触摸屏设备上,它可能会遵循指定的字体大小。

我测试了以下代码:

    DateField dtf1 = new DateField("test1", System.currentTimeMillis(), DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE | Field.READONLY ) {
        protected void layout(int width, int height) {
            super.layout(width, 32);
            System.out.println("height1: " + Integer.toString(this.getHeight()));
        }           
    };
    DateField dtf2 = new DateField("test2", System.currentTimeMillis(), DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE ) {
        protected void layout(int width, int height) {
            super.layout(width, 32);
            System.out.println("height2: " + Integer.toString(this.getHeight()));
        }           
    };
    DateField dtf3 = new DateField("test3", System.currentTimeMillis(), DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE ) {
        protected void layout(int width, int height) {
            super.layout(width, 32);
            System.out.println("height3: " + Integer.toString(this.getHeight()));
        }           
    };

...

        add(dtf1);
        add(dtf2);
        Font smallFont = this.getFont().derive(Font.PLAIN, 15);
        dtf3.setFont(smallFont);
        add(dtf3);

在 9800 上,DateField 的高度始终为 40 像素。在 9300 上,前 2 个为 18,第三个为 15。

因此,由于您使用此 DateField 只是为了显示不可更新的值,因此我建议您改用 SimpleDateFormat 之类的东西来根据需要格式化日期,并将其显示在 LabelField 中。然后,您可以使用您指定的字体管理字段的高度。

于 2013-11-07T12:33:15.053 回答