Уменьшение высоты 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. Затем вы можете управлять высотой поля, используя указанный шрифт.

Другие вопросы по тегам