添加字段直到屏幕已满

时间:2010-02-25 15:53:52

标签: blackberry user-interface

为了这个问题,让我们假设我想要一排按钮。我想在屏幕上放置尽可能多的按钮,但不能再显示。换句话说,只要预期按钮不会被切断或缩短文本,就添加它。

似乎我应该能够做到这样的事情:

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.我怀疑这是因为当我查询宽度时,按钮尚未布局。

所以,也许我可以确保按钮总是相同的大小。但这不会有几个原因:

  1. 不同的BB平台有不同的按钮和文字外观,适合曲线上的按钮,不适合风暴上的按钮。
  2. 第三方主题可能会改变按钮的外观,因此我甚至无法指望某个平台上的按钮具有一定的尺寸。
  3. 在添加按钮之前,我无法实际检查剩余空间吗?这感觉就像一个相当有用的功能;我只是错过了一些东西吗?

3 个答案:

答案 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)

尝试制作自己的Horizo​​ntalFiledManager(扩展管理器)并覆盖


 protected void sublayout( int maxWidth, int maxHeight ){

setExtent(maxWidth,maxHeight); }

获取子项的数量,并通过for循环进入并开始布置子项(setPosition,layoutChild)。 当你布置孩子时,计算他的宽度并总是检查计算的宽度+下一个孩子的宽度是否大于maxWidth然后不布局并打破for循环。 希望这能帮到你。