2012-04-04 65 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