Как рассчитать высоту 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(...);
}
Это не подходит для производства, жесткое кодирование высоты пикселя не рекомендуется. Это простой пример для понимания....