Вопрос

Пытаясь уменьшить высоту 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);
    }
 }

Пожалуйста, предложите.

Спасибо

Это было полезно?

Решение

Второй метод - это ужасный подход (возившаяся с высотой VerticalfieldFieldManager, вы получите много проблем).

Попробуйте первый метод еще раз, но на этот раз звоните 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 - это специализированное поле, и в моем тестировании он игнорирует ограничения, которые вы наложили на него, независимо от того, пытаетесь ли вы сделать это с помощью сдерживающего менеджера или непосредственно в методе макета поля. Кажется, фактическая высота, которую он выберет для себя, будет варьироваться в зависимости от устройства.

Я подозреваю, что на всех устройствах с помощью сенсорного экрана он постарается дать себе достаточно высоты, чтобы быть коснувшись. С точки зрения пикселей, которые будут зависеть от разрешения (DPI) устройства, как фактически, ваше изображение должно быть, потому что оно будет выглядеть по -разному на устройстве с высоким разрешением, например, устройство 9900 для низкого разрешения, например, 9300.

Я подозреваю, что на устройствах, не относящихся к Touchscreen, он, вероятно, будет следовать указанному размеру шрифта.

Я проверил следующий код:

    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 для третьего.

Таким образом, поскольку вы используете это месторождение Date Field, чтобы отобразить не обновляемое значение, я рекомендую вместо этого посмотреть на использование чего -то вроде SimpleDateFormat, форматировать дату, как вы хотите, и отобразить это в Labelfield. Затем вы можете управлять высотой поля, используя шрифт, который вы указываете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top