Domanda

Cercando di ridurre l'altezza di a DateField Dall'impostazione predefinita da 53 a 32, ma inutilmente. L'altezza rimane la stessa con il risultato che il testo appare tagliato verso il fondo dello sfondo che è più piccolo di altezza (32).

Ho provato 2 modi:

    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 ° metodo (basato su un post di overflow dello stack):

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

Si prega di suggerire.

Grazie

È stato utile?

Soluzione

Il secondo metodo è un approccio orribile (scherzare con l'altezza di VerticalfieldManager ti porterà molti problemi).

Prova di nuovo il primo metodo, ma questa volta chiama super.layout primo:

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

Si noti che usando questo approccio potresti anche ottenere problemi, poiché stai preparando ciecamente un metodo senza considerare il resto della classe. Per fare questo in modo sicuro, dovresti avere accesso alla fonte della classe genitore e no.

Suggerirei di estendere HorizontalFieldManager (oltrepassare sublayout) per avere un'altezza fissa (mai VFM perché lo scorrimento va nella stessa direzione che stai cercando di fare fissate). Quindi posizionare all'interno di un campo di data regolare che utilizza tutta l'altezza disponibile (passa il flag Field.USE_ALL_HEIGHT nel costruttore).

Ulteriori informazioni:http://docs.blackberry.com/es-es/developers/delirables/29251/determining_the_dimensions_of_a_field_1578864_11.jsp

Altri suggerimenti

Sospetto che questa sia una battaglia che probabilmente perderai.

Personalmente creerei un aspetto da Datefield da un Labelfield che ti darà le restrizioni di cui hai bisogno.

Datefield è un campo specializzato e nei miei test, ignorerà i limiti che si mette su di esso, indipendentemente dal fatto che tu provi a farlo tramite il gestore contenente o direttamente nel metodo di layout del campo. Sembra che l'altezza effettiva che sceglierà per se stessa varierà in base al dispositivo.

Sospetto che tutti i dispositivi capaci di touchscreen cercheranno di darci un'altezza sufficiente per essere toccata. In termini di pixel che dipenderanno dalla risoluzione (DPI) del dispositivo, come in realtà la tua immagine dovrebbe, perché sembrerà diversa su un dispositivo ad alta risoluzione, come il 9900 a un dispositivo a bassa risoluzione, come il 9300.

Sospetto sui dispositivi non touchscreen, probabilmente seguirà la dimensione del carattere specificata.

Ho testato il seguente codice:

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

Su un 9800, il Datefield era sempre di 40 pixel di altezza. Il 9300 è stato 18 per i primi 2 e 15 per il terzo.

Quindi, dal momento che stai utilizzando questo datefield solo per visualizzare un valore non aggiornabile, ti consiglio invece di guardare qualcosa come SimpleDateFormat, per formattare la data che desideri e visualizzarlo in un Labelfield. È quindi possibile gestire l'altezza del campo utilizzando il carattere specificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top