如何计算黑莓中的Labelfield和Horizo​​ntalFieldmanager高度

时间:2011-11-03 18:46:19

标签: blackberry height field labelfield

我有HorizontalFieldManagerVerticalFieldManagerLabelField。放置在LabelField中的HorizontalFieldManager和多个HorizontalFieldManager放置在VerticalFieldManager

当我尝试使用labelfield.getHeight()获取LabelField高度时;它返回0。如果在Labelfield中有多行,它也会给我高度返回0.同样的问题我正面临HorizontalFieldManager

到达高度后,我想计算VerticalFieldManager高度并动态设置屏幕高度。

如何计算Label或Horizo​​ntalfieldmanager的高度?

3 个答案:

答案 0 :(得分:3)

使用labelField.getPreferredHeight()manager.getPreferredHeight()而不是labelField.getHeight()

这应该对你有用

答案 1 :(得分:2)

方法Farid建议使用它有点困难,因为你需要labelWidth。 对于多行标签,此labelWidth可能与父管理器可用宽度或您设置的某个确切宽度不同,因为每行可以具有不同的宽度,具体取决于单词是否适合maxWidth或不适合。

注意:正如Nate在评论中指出的那样,为空格添加提前也是一个好主意。 我修改了代码以包含它。

以下是我用来克服这些问题的方法:

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

答案 2 :(得分:1)

如果你可以决定LabelField的大小,直到它被布局,那么你将从getHeight()中准确地得到它。这意味着您可以实际获得正确的结果,包括为LabelField考虑任何边距或填充,我认为

int maxWidth = getManager().getPreferredWidth();

会错过。

最初这看起来相当困难,因为通常在将屏幕添加到屏幕时知道高度是很好的。但是一般的原则是你应该在Manager的子布局中执行此操作,因此您只是在稍后的过程中移动依赖于高度的代码。这样做的好处是布局是动态的,所以如果LabelField的文本被更改,那么将调用布局,并且还会重新调用依赖于高度的代码。

也可以在sublayout()中使用这样的逻辑:

super.sublayout(...);

if (myField.getHeight() < 100 ) {

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

  super.sublayout(...);

}

这不是一个适合生产的例子,不推荐硬编码像素高度。这只是一个容易理解的例子......