Как рассчитать высоту Labelfield и HorizontalFieldmanager в BlackBerry - PullRequest
1 голос
/ 03 ноября 2011

У меня есть HorizontalFieldManager, VerticalFieldManager и LabelField.LabelField помещается в HorizontalFieldManager, а несколько HorizontalFieldManager помещаются в VerticalFieldManager.

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

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

Как рассчитать высоту метки или горизонтального полевого менеджера?

Ответы [ 3 ]

3 голосов
/ 04 ноября 2011

Используйте labelField.getPreferredHeight() и manager.getPreferredHeight(), а не labelField.getHeight()

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

2 голосов
/ 08 августа 2013

Метод 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(); 
    }
1 голос
/ 09 августа 2013

Если вы можете оставить решение о размере 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(...);

}

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

...