2011-05-30 27 views
4

我想知道屏幕上有多少垂直房地產可供我的經理使用(無需滾動)。黑莓 - 可用屏幕的高度(不包括橫幅和標題字段)

我想這個經理在一個單獨的類,而不是在屏幕子類。理想情況下,我的經理可以放在任何屏幕上,而不需要知道屏幕細節的傳遞情況 - 該經理將能夠找出屏幕標題/橫幅區域未使用的空間。

我可以通過很多方法獲得屏幕大小。這是很容易的部分。但它不考慮標題/橫幅字段。

我想知道的是如何找到不包含任何標題或橫幅字段的屏幕部分?但我希望有一個通用的解決方案,可以在單獨的類文件中使用,而不需要預先知道要顯示的屏幕。

(解決方法:我會告訴我的經理什麼標題/橫幅場的高度爲,然後我可以使用這些高度,與Display.getHeight()計算的可用空間)

回答

2

我有一個單獨的類(稱之爲CobiPainter),其能夠被任何管理器或屏幕類使用 - 它實現了一個方法,該方法我所說paintBackground(Graphics g)。我從任何相關的paintBackground(Graphics g)覆蓋其背景我要繪製的屏幕調用此方法。

爲了能夠通過任何MainScreen使用,以最小的耦合&額外的工作,我做了它,以便CobiPainter類是能夠計算出多少的屏幕是可用的,而無需給予任何知識標題/橫幅/狀態字段。

我使用的代碼依賴於MainScreen具有我們通常添加字段的內部管理器的事實。這位經理知道我正在尋找的身高。

這是黑客/碼我用:

Screen activeScreen = UiApplication.getUiApplication().getActiveScreen(); 
if (activeScreen instanceof MainScreen) 
{ 
    // get available height excluding banner/title 
    XYRect xy = ((MainScreen) activeScreen).getMainManager() 
     .getExtent(); 
    heightOfTitleAndBanner = xy.y; // <---- can be useful too 
    availableHeight = xy.height; // <---- this is what I wanted 
} 

此代碼將無法正常工作,直到顯示有問題的經理,因爲它依賴於調用getActiveScreen()方法。它還要求MainScreen是使用參數Manager.NO_VERTICAL_SCROLL創建的,以強制屏幕的大小(感謝Himanshu)。

0

有三種fieldmanager像-VerticalFieldManager,Horizo​​ntalFieldManager和FlowFieldManager,可以使用Non-Scrollable進行設置,垂直和水平。 您必須使用參數(Manager.NO_VERTICAL_SCROLL | Manager.NO_HORIZONTAL_SCROLL)創建水平/垂直FieldManager的對象

但是您必須對其進行自定義以滿足您的條件。

如果您想知道標題大小,只需在Horizo​​ntal/Vertical FieldManager中添加containt並分別使用getPreferedHeight()和getPreferedWidth()來獲取其高度或寬度。

這裏是rought代碼:

final LabelField field = new LabelField("Himanshu") 
     { 
      protected void layout(int width, int height) 
      { 
       super.layout(width, height); 
//    setExtent(360, 50); 
      }; 
      public int getPreferredHeight() 
      { 
       return super.getPreferredHeight(); 
      } 
     }; 
     final LabelField field1 = new LabelField("Himanshu") 
     { 
      protected void layout(int width, int height) 
      { 
       super.layout(width, height); 
//    setExtent(360, 50); 
      }; 
      public int getPreferredHeight() 
      { 
       return super.getPreferredHeight(); 
      } 
     }; 
     setTitle(field); 
     setStatus(field1); 
     VerticalFieldManager fieldManager = new VerticalFieldManager(Manager.USE_ALL_WIDTH|Manager.NO_VERTICAL_SCROLL) 
     { 
      protected void sublayout(int maxWidth, int maxHeight) 
      { 
       super.sublayout(maxWidth, maxHeight); 
       this.setExtent(360, Display.getHeight()-(field.getPreferredHeight())-(field1.getPreferredHeight())); 
      } 
     }; 
     fieldManager.setBackground(BackgroundFactory.createSolidBackground(Color.BLUE)); 
     System.out.println("-------------"+field.getPreferredHeight()); 
     add(fieldManager); 
+0

不,我添加了對特定行的評論,在這裏我得到了字段20像素的高度,使用field.getPrefferedHeight()。你應該檢查它 – 2011-05-30 17:01:24

+0

thx - 我仍然無法讓它的功能,我的方式想要 - 也許我沒有解釋得很好。我再次更新了這個問題,指出我正在尋找一個可以從單獨的課程中使用的答案,該課程沒有關於橫幅/標題字段的先前知識。理想情況下,我的代碼不需要引用標題字段。你的'fieldManager'知道'field'和'field1' - 這是我試圖避免的解決方法(如果可能的話)。 – 2011-06-02 09:26:24

0

我所做的是一種系統無法提供該信息的解決方法。

1)從BaseScreen類擴​​展所有屏幕。 。 2)在該類商店你把旗幟的情況下設置橫幅(setBanner())例:

public abstract class BaseScreen extends MainScreen 
{ 
    private StandardTitleBar titleBar; 

    ... // some initializer body, i.e. constructor 
     titleBar = getStandardTitleBar(); 
     setBanner(titleBar); 
    ... 
} 

3)揭露集旗幟的高度/寬度在BaseScreen類

public int getBannerHeight() 
{ 
    if (null == titleBar) 
     return 0; 
    else 
     return titleBar.getHeight(); 
} 

4)保護無效sublayout內(INT maxWidth,詮釋maxHeight)經理使用的:

int bannerHeight = ((BaseScreen) getScreen()).getBannerHeight(); 
int titleHeight = getScreen().getTitleBar().getHeight() // TODO: protect from null 

以我的經驗,我也佔據了虛擬鍵盤的d必要時經理的填充。