Frage

Versuch, die Höhe von a zu reduzieren DateField Von Standard 53 bis 32, aber ohne Erfolg. Die Höhe bleibt gleich mit dem Ergebnis, dass der Text am Boden des Hintergrunds ausgestattet erscheint, der kleiner ist (32).

Ich habe 2 Wege versucht:

    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. Methode (basierend auf einem Stapelüberlaufpost):

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

Bitte vorschlagen.

Vielen Dank

War es hilfreich?

Lösung

Die zweite Methode ist ein schrecklicher Ansatz (durch die Größe von VerticalfieldManager wird Ihnen viele Probleme ausgelöst).

Versuchen Sie die erste Methode erneut, aber diesmal rufen Sie an super.layout Erste:

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

Beachten Sie, dass Sie mit diesem Ansatz auch Störungen erhalten, da Sie eine Methode blind überschreiben, ohne den Rest der Klasse zu berücksichtigen. Um dies sicher zu tun, müssen Sie Zugriff auf die Quelle der Elternklasse haben, und Sie tun es nicht.

Ich würde vorschlagen, sich zu verlängern HorizontalFieldManager (Überschreiben sublayout) eine feste Höhe haben (niemals VFM, da das Scrollen in die gleiche Richtung geht, die Sie reparieren möchten). Platzieren Sie dann in ein reguläres Datumsfeld, das die gesamte verfügbare Höhe verwendet (übergeben Sie das Flag Field.USE_ALL_HEIGHT im Konstruktor).

Mehr Info:http://docs.blackberry.com/es-es/developers/deliverables/29251/determining_the_dimensions_of_a_field_1578864_11.jsp

Andere Tipps

Ich vermute, dies ist eine Schlacht, die Sie wahrscheinlich verlieren werden.

Persönlich würde ich ein Datumspunkt aus einem Labor-ähnlich erstellen, das Ihnen die Einschränkungen gibt, die Sie benötigen.

DateField ist ein spezialisiertes Feld und ignoriert in meinen Tests die Einschränkungen, die Sie darauf hingewiesen haben, unabhängig davon, ob Sie versuchen, dies über den enthaltenen Manager oder direkt in der Layout -Methode des Feldes zu tun. Es scheint, dass die tatsächliche Höhe, die sie für sich selbst wählen wird, je nach Gerät variieren.

Ich vermute auf allen Touchscreen -fähigen Geräten, es wird versuchen, sich genügend Höhe zu geben, um berührt zu werden. In Bezug auf Pixel, die von der Auflösung (DPI) des Geräts abhängen, wie dies tatsächlich Ihr Bild sollte, da es auf einem hochauflösenden Gerät wie dem 9900 -Gerät wie dem 9300 anders aussieht.

Ich vermute auf Nicht-Touchscreen-Geräte, es wird wahrscheinlich der angegebenen Schriftgröße folgen.

Ich habe den folgenden Code getestet:

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

Bei einem 9800 war das Datumfeld immer 40 Pixel hoch. Bei einem 9300 war 18 für die ersten 2 und 15 für den dritten.

Da Sie dieses Datum nur verwenden, um einen nicht aktualisierbaren Wert anzuzeigen, empfehle ich stattdessen, dass Sie etwas wie SimpleDateFormat verwenden, das Datum so formatieren, wie Sie möchten, und dies in einem Labor anzeigen. Sie können dann die Höhe des Feldes mithilfe der von Ihnen angegebenen Schriftart verwalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top