Question

Essayant de réduire la hauteur d'un DateField De par défaut 53 à 32, mais en vain. La hauteur reste la même avec le résultat que le texte apparaît coupé vers le bas de l'arrière-plan, ce qui est plus petit (32).

J'ai essayé 2 façons:

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

2e méthode (basée sur un post de débordement de pile):

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

Veuillez suggérer.

Merci

Était-ce utile?

La solution

La deuxième méthode est une approche horrible (jouer avec la hauteur de VerticalFieldManager vous causera beaucoup de problèmes).

Essayez à nouveau la première méthode, mais cette fois appelez super.layout première:

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

Notez que l'utilisation de cette approche, vous pouvez également obtenir des problèmes, car vous remplacez aveuglément une méthode sans considérer le reste de la classe. Pour ce faire en toute sécurité, vous auriez besoin d'avoir accès à la source de classe parent, et vous ne le faites pas.

Je suggérerais d'étendre HorizontalFieldManager (passer outre sublayout) pour avoir une hauteur fixe (jamais VFM car le défilement va dans la même direction que vous essayez de faire fixe). Placez ensuite à l'intérieur d'un champ de date régulier qui utilise toute la hauteur disponible (passer le drapeau Field.USE_ALL_HEIGHT dans le constructeur).

Plus d'informations:http://docs.blackberry.com/es-es/developers/deliverables/29251/determining_the_dimensions_of_a_field_1578864_11.jsp

Autres conseils

Je soupçonne que c'est une bataille que vous êtes susceptible de perdre.

Personnellement, je créerais un look de Datefield à partir d'un labelfield qui vous donnera les restrictions dont vous avez besoin.

DateField est un champ spécialisé et dans mes tests, il ignorera les limitations que vous y mettez, que vous essayiez ou non de le faire via le gestionnaire contenu ou directement dans la méthode de mise en page du champ. Il semble que la hauteur réelle qu'il choisisse pour elle-même variera selon l'appareil.

Je soupçonne que sur tous les appareils capables à écran tactile, il essaiera de se donner suffisamment de hauteur pour être touché. En termes de pixels qui dépendront de la résolution (DPI) de l'appareil, comme en fait votre image devrait, car elle sera différente sur un appareil haute résolution, comme le 9900 à un appareil à basse résolution, comme le 9300.

Je soupçonne que sur les appareils non écran, il suivra probablement la taille de la police spécifiée.

J'ai testé le code suivant:

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

Sur un 9800, le Datefield était toujours de 40 pixels de hauteur. Sur un 9300 était de 18 pour les 2 et 15 premiers pour le troisième.

Donc, comme vous utilisez ce Datefield juste pour afficher une valeur non mise à jour, je recommande plutôt que vous envisagez d'utiliser quelque chose comme SimpledateFormat, pour formater la date comme vous le souhaitez et l'afficher dans un labelfield. Vous pouvez ensuite gérer la hauteur du champ en utilisant la police que vous spécifiez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top