2012-04-04 63 views
0

我希望我的應用能夠將兩個字段,一個左邊和另一個字段對齊到屏幕的最左端。爲此我使用GridLayoutManager類。這裏是我的代碼在黑莓的網格佈局中將字段對齊到右邊

GridFieldManager gridFieldManager = new GridFieldManager(2,2, GridFieldManager.PREFERRED_SIZE_WITH_MAXIMUM); 

gridFieldManager.add(new ButtonField("Button One"), Field.FIELD_HCENTER); 
gridFieldManager.add(new ButtonField("Button Two"), Field.FIELD_RIGHT); 

gridFieldManager.add(new ButtonField("HC", Field.FIELD_HCENTER)); 
gridFieldManager.add(new ButtonField("RT", Field.FIELD_RIGHT)); 

add(gridFieldManager); 

而且,這裏是我在模擬器輸出

enter image description here

任何人都可以請幫我的兩個按鈕排列在屏幕的最右邊?任何幫助將不勝感激。

+0

檢查[我的回答(http://stackoverflow.com/a/10082358/396949)的替代解決方案。 – mrvincenzo 2012-04-10 07:56:51

回答

2

請使用下面的類。

import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.container.HorizontalFieldManager; 

public class HFMLeftFieldRightField extends HorizontalFieldManager { 

private Field leftField; 
private Field rightField; 

private final static int TOP_MARGIN = 0; 
private final static int LEFT_MARGIN = 30; 

public HFMLeftFieldRightField() { 
    super(USE_ALL_WIDTH); 
} 

public HFMLeftFieldRightField(boolean isQatari) { 
    super(USE_ALL_WIDTH | Field.FIELD_LEFT); 
} 

public void sublayout(int maxWidth, int maxHeight) { 

    super.sublayout(maxWidth, maxHeight); 
    int width = getWidth(); 

    if (rightField != null) { 
    int x = width - rightField.getWidth() - LEFT_MARGIN; 
    int y = TOP_MARGIN; 
    setPositionChild(rightField, x, y); 
    } 
    if (leftField != null) { 
    int y = TOP_MARGIN+rightField.getHeight()/5; 
    int x = LEFT_MARGIN; 
    setPositionChild(leftField, 0, y); 
    } 

    setExtent(maxWidth, rightField.getHeight() + TOP_MARGIN * 2); 
} 

public void setLeftButton(Field leftField) { 
    this.leftField = leftField; 
super.add(leftField); 
} 

public void setRightButton(Field rightField) { 
    this.rightField = rightField; 
    super.add(rightField); 
} 


} 

並添加這個字段。

HFMLeftFieldRightField hfm = new HFMLeftFieldRightField(); 
hfm.setLeftButton(new EditField("Left")); 
hfm.setRightButton(new EditField("Right")); 
add(hfm); 

更多細節http://keraisureshvblackberry.blogspot.in/2012/02/there-are-very-common-there-there-are.html

希望有幫助..

+0

這裏的子佈局()是多餘的。你只能用對齊標誌離開。 – mrvincenzo 2012-04-04 14:12:27

+0

謝謝蘇雷什。 – 2012-04-04 14:26:37

+0

@MrVincenzo使用HFM意味着你想要一個特定的水平佈局,並且不可能有一個通用的水平佈局算法,避免重疊,同時也滿足每個子域上的左,右,中心等水平約束。 Horizo​​ntalFieldManager的解決方案是忽略水平對齊標誌,只使用垂直標誌。爲了得到OP想要的行爲,需要一個自定義管理器。 – 2012-04-09 01:54:21

0

更改您的gridFieldManager構造樣式參數 GridFieldManager.USE_ALL_WIDTH

它應該是這樣的

GridFieldManager gridFieldManager = new GridFieldManager(2,2,GridFieldManager.USE_ALL_WIDTH); 
+0

我試過這個..但沒有運氣。 – 2012-04-04 12:58:22

+0

然後覆蓋gridfieldManager的子佈局並設置子位置 – Nsr 2012-04-04 13:12:31

2

好像你應該使用JustifiedHorizo​​ntalFieldManager,而不是GridFieldManager。 JustifiedHorizo​​ntalFieldManager不是BlackBerry SDK中包含的標準管理器,而是RIM稍後發佈的一組UI組件中的一員,可幫助開發人員構建更豐富的UI界面。你必須從here下載代碼,將其添加到您的proyect然後包括以下行:

JustifiedHorizontalFieldManager justifiedManager = new JustifiedHorizontalFieldManager(buttonOne, buttonTwo, false, USE_ALL_WIDTH); 
3

基本上它的定位標誌和網格的列屬性的所有問題。

GridFieldManager樣式更改爲Manager.USE_ALL_WIDTH並將列屬性設置爲GridFieldManager.AUTO_SIZE使所有可用空間在兩列之間進行事件劃分。

gridFieldManager.setColumnProperty(0, GridFieldManager.AUTO_SIZE, 0); 
gridFieldManager.setColumnProperty(1, GridFieldManager.AUTO_SIZE, 0); 

下面的代碼段

GridFieldManager gridFieldManager = new GridFieldManager(2,2, Manager.USE_ALL_WIDTH); 
gridFieldManager.setColumnProperty(0, GridFieldManager.AUTO_SIZE, 0); 
gridFieldManager.setColumnProperty(1, GridFieldManager.AUTO_SIZE, 0); 

gridFieldManager.add(new ButtonField("Button One"), Field.FIELD_LEFT); 
gridFieldManager.add(new ButtonField("Button Two"), Field.FIELD_RIGHT); 
gridFieldManager.add(new ButtonField("HC"), Field.FIELD_LEFT); 
gridFieldManager.add(new ButtonField("RT"), Field.FIELD_RIGHT); 

add(gridFieldManager); 

產生

enter image description here


這稍微修改代碼段

GridFieldManager gridFieldManager = new GridFieldManager(1,2, Manager.USE_ALL_WIDTH); 
gridFieldManager.setColumnProperty(0, GridFieldManager.AUTO_SIZE, 0); 
gridFieldManager.setColumnProperty(1, GridFieldManager.AUTO_SIZE, 0); 

VerticalFieldManager vfmLeft = new VerticalFieldManager(); 
vfmLeft.add(new ButtonField("Button One", Field.FIELD_HCENTER)); 
vfmLeft.add(new ButtonField("HC", Field.FIELD_HCENTER)); 
gridFieldManager.add(vfmLeft, Field.FIELD_LEFT); 

VerticalFieldManager vfmRight = new VerticalFieldManager(); 
vfmRight.add(new ButtonField("Button Two", Field.FIELD_HCENTER)); 
vfmRight.add(new ButtonField("RT", Field.FIELD_HCENTER)); 
gridFieldManager.add(vfmRight, Field.FIELD_RIGHT); 

add(gridFieldManager); 

產生

enter image description here


最後,要說明我以前說過的可用空間被兩列之間evently分,下面的代碼片段

GridFieldManager gridFieldManager = new GridFieldManager(1,2, Manager.USE_ALL_WIDTH | Manager.USE_ALL_HEIGHT); 
gridFieldManager.setColumnProperty(0, GridFieldManager.AUTO_SIZE, 0); 
gridFieldManager.setColumnProperty(1, GridFieldManager.AUTO_SIZE, 0); 
gridFieldManager.setRowProperty(0, GridFieldManager.AUTO_SIZE, 0); 

VerticalFieldManager vfmLeft = new VerticalFieldManager(Manager.USE_ALL_WIDTH | Manager.USE_ALL_HEIGHT); 
vfmLeft.setBackground(BackgroundFactory.createSolidBackground(Color.CYAN)); 
gridFieldManager.add(vfmLeft); 

VerticalFieldManager vfmRight = new VerticalFieldManager(Manager.USE_ALL_WIDTH | Manager.USE_ALL_HEIGHT); 
vfmRight.setBackground(BackgroundFactory.createSolidBackground(Color.GRAY)); 
gridFieldManager.add(vfmRight); 

add(gridFieldManager);  

產生兩列大小相等的列。

enter image description here

+0

非常好的答案。感謝您將它放在一起。 – 2012-04-10 05:45:05