Pergunta

Tentando reduzir a altura de um DateField De padrão 53 a 32, mas sem sucesso. A altura permanece a mesma, com o resultado de que o texto aparece na parte inferior do fundo, com menor altura (32).

Eu tentei 2 maneiras:

    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º método (com base em uma postagem de estofamento de pilha):

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 sugira.

Obrigado

Foi útil?

Solução

O segundo método é uma abordagem horrível (mexer com a altura do verticalfieldManager fará com que muitos problemas).

Experimente o primeiro método novamente, mas desta vez chamada super.layout primeiro:

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

Observe que, usando essa abordagem, você também pode obter falhas, pois está substituindo cegamente um método sem considerar o restante da classe. Para fazer isso com segurança, você precisaria ter acesso à fonte da classe pai e não.

Eu sugiro estender HorizontalFieldManager (sobrepor sublayout) ter uma altura fixa (nunca VFM porque a rolagem segue na mesma direção que você está tentando fazer fixo). Em seguida, coloque dentro de um campo de data regular que usa toda a altura disponível (passe a bandeira Field.USE_ALL_HEIGHT no construtor).

Mais informações:http://docs.blackberry.com/es-es/developers/deliverables/29251/determining_the_dimensions_of_a_field_1578864_11.jsp

Outras dicas

Eu suspeito que esta é uma batalha que você provavelmente perderá.

Pessoalmente, eu criaria uma aparência parecida com o DateField a partir de um Labelfield, que lhe dará as restrições de que você precisa.

O DateField é um campo especializado e, em meus testes, ele ignorará as limitações que você coloca, independentemente de você tentar fazer isso através do gerente contendo ou diretamente no método de layout do campo. Parece que a altura real que ela escolherá varia de acordo com o dispositivo.

Suspeito em todos os dispositivos capazes de tela sensível ao toque, ele tentará dar altura suficiente para ser tocada. Em termos de pixels que dependerão da resolução (DPI) do dispositivo, como sua imagem deve, porque parecerá diferente em um dispositivo de alta resolução, como o 9900 para um dispositivo de baixa resolução, como o 9300.

Suspeito de dispositivos não-touchscreen, provavelmente seguirá o tamanho da fonte especificado.

Eu testei o seguinte 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);

Em um 9800, o Datefield sempre tinha 40 pixels de altura. Em um 9300 é de 18 para os primeiros 2 e 15 para o terceiro.

Portanto, como você está usando este DateField apenas para exibir um valor não atualizável, eu recomendo, em vez disso, você olha usando algo como SimpleDateFormat, para formatar a data que desejar e exibir isso em um Labelfield. Você pode gerenciar a altura do campo usando a fonte que você especificar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top