为了这个问题,让我们假设我想要一排按钮。我想在屏幕上放置尽可能多的按钮,但不能再显示。换句话说,只要预期按钮不会被切断或缩短文本,就添加它。
似乎我应该能够做到这样的事情:
HorizontalFieldManager hfm = new HorizontalFieldManager();
int remainingWidth = Display.getWidth();
int i =0;
while(true) {
ButtonField bf = new ButtonField("B " + i);
remainingWidth -= bf.getWidth();
if(remainingWidth<0)
break;
hfm.add(bf);
i++;
}
add(hfm);
但这不起作用。 bf.getWidth()始终为0.我怀疑这是因为当我查询宽度时,按钮尚未布局。
所以,也许我可以确保按钮总是相同的大小。但这不会有几个原因:
在添加按钮之前,我无法实际检查剩余空间吗?这感觉就像一个相当有用的功能;我只是错过了一些东西吗?
答案 0 :(得分:1)
尝试在向其添加组件之前绘制管理器。
如果按钮有一个填充,你也应该添加填充。
public class Main extends UiApplication{
public static void main(String[] args) {
Main main = new Main();
main.enterEventDispatcher();
}
public Main() {
Screen main = new Screen();
this.pushScreen(main);
main.init();
}
}
public class Screen extends MainScreen {
HorizontalFieldManager hfm;
public Screen() {
hfm = new HorizontalFieldManager();
this.add(hfm);
}
public void init() {
int remainingWidth = Display.getWidth();
int i = 0;
while(true) {
ButtonField bf = new ButtonField("B " + i);
hfm.add(bf);
remainingWidth -= bf.getWidth();
System.out.println(remainingWidth);
if(remainingWidth <= 0) {
hfm.delete(bf);
break;
}
i++;
}
}
答案 1 :(得分:1)
你是正确的getWidth()
在布局之后返回字段的宽度(这就是为什么它为0),但getPreferredWidth()
将返回给定的值到布局管理器,可能就是你想要的。
你遇到的另一个问题是你将remainingWidth
与0进行比较。如果一个按钮的首选宽度是36像素,剩下的宽度是20像素,你将在一个按钮中绘制一个按钮。在没有足够空间展示它的地方。
尝试这样的事情:
HorizontalFieldManager hfm = new HorizontalFieldManager();
int remainingWidth = Display.getWidth();
for (int i; true; i++ ) {
ButtonField bf = new ButtonField("B " + i);
int preferredWidth = bf.getPreferredWidth();
if ( remainingWidth < preferredWidth )
break;
remainingWidth -= preferredWidth;
hfm.add(bf);
}
add(hfm);
答案 2 :(得分:0)
尝试制作自己的HorizontalFiledManager(扩展管理器)并覆盖
protected void sublayout( int maxWidth, int maxHeight ){
setExtent(maxWidth,maxHeight);
}
获取子项的数量,并通过for循环进入并开始布置子项(setPosition,layoutChild)。
当你布置孩子时,计算他的宽度并总是检查计算的宽度+下一个孩子的宽度是否大于maxWidth然后不布局并打破for循环。
希望这能帮到你。