尝试将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);
}
}
请建议。
由于
答案 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
)。
答案 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中显示。然后,您可以使用指定的字体管理字段的高度。