减少Blackberry OS 5.0 DateField高度

时间:2013-11-07 11:00:43

标签: blackberry datefield

尝试将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);
    }
 }

请建议。

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

就个人而言,我会从LabelField创建一个类似于DateField的样式,它将为您提供所需的限制。

DateField是一个专门的Field,在我的测试中,无论你是通过包含Manager还是直接在Field的布局方法中尝试这样做,它都会忽略你对它的限制。看来它自己选择的实际高度因设备而异。

我怀疑在所有支持触摸屏的设备上,它会尝试给自己足够的高度来触摸。对于取决于设备分辨率(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上,前两个是18,第三个是15。

因此,由于您仅使用此DateField来显示不可更新的值,我建议您使用类似SimpleDateFormat的方法来格式化日期,并在LabelField中显示。然后,您可以使用指定的字体管理字段的高度。