2009-06-22 50 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