试图将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);
}
};
第二种方法(基于堆栈溢出帖子):
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);
}
}
请指教。
谢谢
第二种方法是一种可怕的方法(弄乱 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
我怀疑这是一场你可能会输掉的战斗。
就个人而言,我会从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 上,日期字段的高度始终为 40 像素。 在 9300 上,前 2 个为 18,第三个为 15。
因此,由于您使用此日期字段只是为了显示不可更新的值,因此我建议您考虑使用类似 SimpleDateFormat 的东西来根据需要格式化日期,并将其显示在 LabelField 中。 然后,您可以使用指定的字体管理字段的高度。