Blackberry - 更新屏幕会更改管理器其字段元素的绘制顺序

时间:2009-06-22 17:35:41

标签: user-interface layout blackberry repaint

方案
在一个屏幕上,我有2个经理:1)顶部的菜单管理器和2)具有信息/按钮元素的体育经理。菜单管理器执行自定义绘图,使其菜单元素(LabelFields)间隔适当。

核心问题 - 经理和子字段绘图顺序
屏幕绘制正常,除非用户执行操作(单击按钮),导致添加/删除正文管理器的元素。一旦从正文中添加/删除了字段元素,绘制菜单的顺序就会混淆。

当正文管理员添加或删除字段时, 而不是菜单管理器绘制本身,然后是其子元素(标签字段),菜单管理器开始绘制其子元素然后自己 ;因此,在标签字段的顶部绘画,使它们看起来像是已经消失了。

评论
已经尝试过invalidate和其他选项 - 我试图在添加/删除正文中的字段元素后调用invalidate,invalidateall,updateDisplay ....一切都没有成功。

删除自定义子布局工作 - 我可以解决此问题的唯一方法是删除菜单管理器自定义子布局逻辑。不幸的是,菜单系统然后以传统方式绘制并且不提供足够的间距。

下面是菜单管理器的子布局代码,我在这里遗漏了什么?

public void sublayout(int iWidth, int iHeight)
{
    final int iNumFields = getFieldCount();
    int maxHeight = 0;


    final int segmentWidth = iWidth / iNumFields;
    final int segmentWidthHalf = segmentWidth / 2;

    for (int i = 0; i < iNumFields; i++)
    {
        final Item currentField = (Item)this.getField(i);

        // 1. Use index to compute bounds of the field
        final int xSegmentTrueCenter = segmentWidth * i + segmentWidthHalf;

        // 2. center field inbetween bounds using field width (find fill width of text)
        final int xFieldStart = xSegmentTrueCenter - currentField.getFont().getAdvance(currentField.getText())/2;

        // set up position
        setPositionChild(currentField, xFieldStart, getContentTop() + MenuAbstract.PADDING_VERTICAL);

        // allow child to draw itself
        layoutChild(currentField, iWidth, currentField.getHeight());


        // compute max height of the field
        //int fieldheight = currentField.getHeight();
        maxHeight = currentField.getHeight() > maxHeight
            ? currentField.getHeight() + 2 * MenuAbstract.PADDING_VERTICAL
            : maxHeight;
    }
    this.setExtent(iWidth, maxHeight);
}

最终问题
最终我想保留菜单管理器的自定义布局,同时允许重绘字段元素。以下是我的最后一个问题:

  1. 你以前见过这个吗?

  2. 为什么在向屏幕添加/删除字段元素时菜单管理器会以错误的顺序开始绘制?

  3. 本机Manager.sublayout()是否做了我不应该维护绘图顺序的事情?

1 个答案:

答案 0 :(得分:1)

我没有看到你描述的行为,但以下行有点令人不安:

// allow child to draw itself
layoutChild(currentField, iWidth, currentField.getHeight());
在字段通过layoutChild方法调用setExtent之前,

getHeight()不应返回合理的值。虽然我希望它会在所有情况下都会引起问题 - 但不确定为什么这会在第一时间起作用。在你的逻辑中,我认为你可以安全地在该行中使用iHeight而不是currentField.getHeight()。该字段只会使它自己变得如此大 - 它不会使用所有的iHeight,除非它像VerticalFieldManager