Уменьшение высоты Blackberry OS 5.0 DateField
Пытаясь уменьшить высоту DateField
по умолчанию от 53 до 32, но безрезультатно. Высота остается той же самой, в результате текст кажется вырезанным к нижней части фона, который меньше по высоте (32).
Я пробовал 2 способа:
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);
}
};
2-й метод (основан на посте переполнения стека):
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 ответа
Второй метод - ужасный подход (при работе с вертикалью 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
Я подозреваю, что это битва, которую вы, вероятно, проиграете.
Лично я бы создал похожий на DateField объект LabelField, который предоставит вам необходимые ограничения.
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 было 18 для первых 2 и 15 для третьего.
Итак, поскольку вы используете этот DateField только для отображения не обновляемого значения, я рекомендую вместо этого посмотреть на использование чего-то вроде SimpleDateFormat, отформатировать дату так, как вы хотите, и отобразить ее в LabelField. Затем вы можете управлять высотой поля, используя указанный шрифт.