2011-06-19 108 views
1

這是一個非常基本的東西,但我似乎無法找到答案搜索網。黑莓和Editfields

基本上,我在Horizo​​ntalFieldManager上顯示兩個EditField相鄰的問題。

我相信從我讀過的EditField使用它所在容器的最大寬度。考慮到這一點,我認爲添加editFields來分離VerticalFieldManagers,然後將它們添加到我的Horizo​​ntalFieldManager中將會起作用。下面是更多的代碼即時通訊這樣做。但不幸的是,userName顯示正常,但密碼字段無法解除。任何想法做什麼即時錯誤?

  HorizontalFieldManager hfm = new HorizontalFieldManager(Manager.USE_ALL_WIDTH));   
    VerticalFieldManager vfmUser = new VerticalFieldManager(); 
    VerticalFieldManager vfmPassw = new VerticalFieldManager(; 

    userName = new EditField("Username:", "", 5, EditField.FIELD_LEFT); 
    password = new PasswordEditField("Pass: ", "", 5, PasswordEditField.FIELD_RIGHT); 

    vfmUser.add(userName); 
    vfmPassw.add(password); 

    hfm.add(vfmUser); 
    hfm.add(vfmPassw); 
    add(hfm); 
+0

爲什麼你在同一行中添加兩個EditField並不是一個好的做法。 – BBdev

回答

1

的問題是,在EditField中仍然會嘗試使用所有的寬度,這會導致VerticalFieldManager也使用提供給它的整個寬度,有效地推搡關密碼字段。

我知道做這樣的事情的唯一方法是創建明確設置其寬度爲屏幕50%的類。有兩種方法:創建EditField和PasswordEditField的子類,或創建Horizo​​ntalFieldManager的子類。前一種選擇在不同的平臺上更容易和更可靠,但需要兩個類而不是一個。

要做到這一點,你需要創建EditField中的一個子類,並覆蓋其layout方法看起來是這樣的:

protected void layout(int maxWidth, int maxHeight) { 
    super.layout(maxWidth, maxHeight); 
    this.setExtent(Display.getWidth()/2, this.getHeight()); 
} 

同樣的PasswordEditField。

根據你希望它的行爲方式,你也可能需要重寫其他方法。例如,這段代碼(我很確定,沒有專門測試過)會導致任何額外的字符被截斷,如果他們不適合在所需的區域。如果這不是您想要的,您可能需要重寫paint或根據當前文本更改佈局。此外,您應該在傾斜暴風雨屏幕時進行測試以確保大小更新正確 - 在大多數情況下它應該可以正常工作,但是如果您在屏幕上具有某些管理員配置,則會導致其不更新佈局/大小。

如果你決定去管理者路由(我不再特別推薦,因爲你可能會碰到更多的問題),你需要擴展Manager或者Horizo​​ntalFieldManager(可能更容易做前者,所以你不必處理HFM的一些怪癖),並覆蓋它的sublayout方法。在這種方法中,您需要爲管理器中的每個字段(在您的情況下,用戶字段和密碼字段)呼叫layoutChildsetPositionChild(按此順序)。然後,最後,您要撥打setExtent。我會向您推薦關於此問題的黑莓文檔,但坦率地說,您最好在尋找如何實施黑莓自定義管理器,或者在SO上提出問題。

所有這一切,你可能還想重新考慮你爲什麼要這樣做。我可以保證從經驗中得知,有些手機的用戶界面看起來不正確 - 我們曾嘗試過類似的方法,並最終取消了它,因爲我們無法從所有設備的用戶界面上使用它。有lots of different resolutions - 一些非常狹窄,一些非常廣泛 - 如果你去用這個用戶界面,那麼一些設備將擁有非常擁擠的登錄。恕我直言,最好與其他BlackBerry應用程序保持一致,並在不同的行上輸入用戶名和密碼。

0

Horizo​​ntalFieldManager hfm = new Horizo​​ntalFieldManager();

 userName = new EditField("Username:", "", 5, EditField.FIELD_LEFT) 
     { 
      protected void layout(int maxWidth, int maxHeight) { 
       super.layout(maxWidth, maxHeight); 
       this.setExtent(Display.getWidth()/2, this.getHeight()); 
      } 
     } 
     ; 
     password = new PasswordEditField("Pass: ", "", 5, PasswordEditField.FIELD_RIGHT) 

     { 
      protected void layout(int maxWidth, int maxHeight) { 
       super.layout(maxWidth, maxHeight); 
       this.setExtent(Display.getWidth()/2, this.getHeight()); 
      } 
     }; 


     hfm.add(userName); 
     hfm.add(password); 

     add(hfm); 

試試這段代碼。我將成爲你的問題的解決方案。