Как рассчитать высоту Labelfield и HorizontalFieldmanager в BlackBerry

Я имею HorizontalFieldManager,VerticalFieldManager а также LabelField, LabelField помещен в HorizontalFieldManager и несколько HorizontalFieldManager помещены в VerticalFieldManager,

Когда я пытаюсь получить высоту LabelField, используя labelfield.getHeight(); он возвращает 0 . если есть несколько строк в Labelfield, это также дает мне рост возвращает 0 . Та же проблема, с которой я сталкиваюсь для HorizontalFieldManager,

После достижения высоты я хочу рассчитать VerticalFieldManager Высота и установить высоту динамически для экрана.

Как я могу рассчитать высоту Label или Horizontalfieldmanager?

3 ответа

Использование labelField.getPreferredHeight() а также manager.getPreferredHeight() не labelField.getHeight()

Это должно работать для вас

Метод Farid предполагает, что его немного сложно использовать, потому что вам понадобится labelWidth. Для многострочной метки этот labelWidth может не совпадать с доступной шириной родительских менеджеров или определенной точной шириной, которую вы установили, поскольку каждая строка может иметь разную ширину в зависимости от того, соответствуют ли слова maxWidth или нет.

ПРИМЕЧАНИЕ: как отметил Нейт в комментариях, неплохо бы также добавить аванс для пробелов. Я изменил код, чтобы включить это.

Вот метод, который я использую для преодоления этих проблем:

public int getPreferredHeight() {
        String text = getText();

        int maxWidth = getManager().getPreferredWidth();
        int spaceAdvance = getFont().getAdvance(' ');
        String[] words = StringUtilities.stringToWords(text);
        int lastWordAdvance = 0;
        int lines = 1;
        for (int i = 0; i < words.length; i++) {
            int wordAdvance = getFont().getAdvance(words[i]) + spaceAdvance;
            if (lastWordAdvance + wordAdvance < maxWidth ) {
                lastWordAdvance += wordAdvance;
            } else {
                lines++;
                lastWordAdvance = wordAdvance;
            }
        }
        return (int)lines * getFont().getHeight(); 
    }

Если вы можете оставить решение о размере LabelField до тех пор, пока он не будет размечен, то вы получите его точно из getHeight(). Это означает, что вы действительно можете получить правильный результат, в том числе с учетом любого поля или отступа для LabelField, что, я думаю,

int maxWidth = getManager().getPreferredWidth();

Будет не хватать.

Поначалу это кажется довольно сложным, потому что обычно полезно знать высоту, когда вы добавляете поле на экран. Но общий принцип заключается в том, что вы должны сделать это в подуровне менеджера, поэтому вы просто перемещаете код, который зависит от высоты, чуть позже в процессе. И это имеет то преимущество, что макет является динамическим, поэтому, если текст LabelField изменяется, то будет вызываться макет, и ваш код, зависящий от высоты, также будет повторно вызываться.

Также возможно использовать такую ​​логику в sublayout():

super.sublayout(...);

if (myField.getHeight() < 100 ) {

  myField.setMargin((100 - myField.getHeight())/2, 0, (100 - myField.getHeight())/2, 0);

  super.sublayout(...);

}

Это не подходит для производства, жесткое кодирование высоты пикселя не рекомендуется. Это простой пример для понимания....

Другие вопросы по тегам