2009-06-22 49 views
0

情景
在屏幕我有2个管理器:1)菜单管理器在顶部和2),其具有信息/按钮元素体管理器。菜单管理器执行自定义绘图,以便其菜单元素(LabelFields)的间距适当。黑莓 - 更新屏幕变化经理的绘制顺序其域元素

核心问题 - 管理器和子场描绘顺序
屏幕绘制除了当用户预成型件的动作(点击一个按钮)微细导致withing主体管理器的元件被添加/移除。一旦将字段元素添加到主体中或从主体中删除,菜单的绘制顺序就会混淆在一起。

当身体管理器添加或删除的字段,,而不是菜单管理器绘图自身,然后它的子元素(标签字段),则菜单管理器开始绘制它的子元素,然后本身;从而在标签字段的顶部绘画,使它们看起来像已经消失。

评论
已经尝试过无效和其他选项 - 我试着打电话从身体添加/删除域元素后无效,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

我还没有看到你所描述的行为,但是下面一行是有点麻烦:

直到场已setExtent称为
// allow child to draw itself 
layoutChild(currentField, iWidth, currentField.getHeight()); 

的getHeight()不应返回一个合理的值通过layoutChild方法。虽然我期望它会导致问题在所有情况下 - 不知道为什么,这将解决在第一时间。在你的逻辑,我认为你可以放心地只在该行使用IHEIGHT代替currentField.getHeight()。本场只会让自己一样大,它需要 - 它不会使用所有IHEIGHT的,除非它的东西,就像一个VerticalFieldManager

+0

感谢您的意见,我会尝试了这一点! – AtariPete 2009-06-25 17:28:09