Pregunta

Tratando de reducir la altura de un DateField De predeterminado 53 a 32, pero fue en vano. La altura permanece igual con el resultado de que el texto aparece cortado hacia la parte inferior del fondo que es de menor altura (32).

Intenté 2 maneras:

    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);
        }           
    };

2do método (basado en una publicación de desbordamiento de pila):

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);
    }
 }

Por favor recomiende.

Gracias

¿Fue útil?

Solución

El segundo método es un enfoque horrible (jugar con la altura de VerticalFieldManager te dará muchos problemas).

Pruebe el primer método nuevamente, pero esta vez llame super.layout primero:

    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);
        }           
    };

Tenga en cuenta que, utilizando este enfoque, también puede obtener fallas, ya que está anulando a ciegas un método sin considerar el resto de la clase. Para hacer esto de manera segura, necesitaría tener acceso a la fuente de clase principal, y no lo hace.

Sugeriría extender HorizontalFieldManager (anular sublayout) tener una altura fija (nunca VFM porque el desplazamiento va en la misma dirección que está tratando de arreglar). Luego coloque dentro de un campo de fecha regular que use toda la altura disponible (pase la bandera Field.USE_ALL_HEIGHT en el constructor).

Más información:http://docs.blackberry.com/es-es/developers/deliverables/29251/determining_the_dimensions_of_a_field_1578864_11.jsp

Otros consejos

Sospecho que esta es una batalla que es probable que pierdas.

Personalmente, crearía un aspecto de Datefield desde un Labelfield que le dará las restricciones que necesita.

Datefield es un campo especializado y en mis pruebas, ignorará las limitaciones que le imponga, independientemente de si intenta hacerlo a través del administrador de contenido o directamente en el método de diseño del campo. Parece que la altura real que elegirá variará según el dispositivo.

Sospecho que en todos los dispositivos capaces de la pantalla táctil, intentará darse suficiente altura para ser tocada. En términos de píxeles que dependerán de la resolución (DPI) del dispositivo, como de hecho, su imagen debería, porque se verá diferente en un dispositivo de alta resolución, como el 9900 a un dispositivo de baja resolución, como el 9300.

Sospecho que en los dispositivos no táctiles, probablemente seguirá el tamaño de la fuente especificado.

Probé el siguiente código:

    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);

En un 9800, el Datefield siempre tenía 40 píxeles de altura. En un 9300 IS fue 18 para los primeros 2 y 15 para el tercero.

Entonces, dado que está utilizando este DateField solo para mostrar un valor no actualizable, le recomiendo que busque usar algo como SimpleDateFormat, para formatear la fecha como desee y mostrarlo en un Labelfield. Luego puede administrar la altura del campo utilizando la fuente que especifique.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top