在Custom Manager中将宽度设置为字段

时间:2012-05-10 13:34:19

标签: blackberry

我是黑莓手机的新手,并试图成为一名自定义经理。所以我试图使布局非常简单,这将显示两个彼此之间的Labelfields。(我可以通过将它们都放到Horizo​​ntalFieldManager中来轻松获得它,但我需要使用自定义管理器来完成此操作。)

Out put应该是这样的: - Hello(FirstField) User(SecondField)

这是我班级中的sublayout方法,它扩展到Manager

public MyManager() {
    // construct a manager with vertical scrolling
    super(Manager.VERTICAL_SCROLL);
    }

protected void sublayout(int width, int height) {
        Field field;
        // get total number of fields within this manager
        int numberOfFields = getFieldCount();
        int x = 0;
        int y = 0;
        for (int i = 0; i < numberOfFields; i++) {
            field = getField(i); // get the field
            setPositionChild(field, x, y); // set the position for the field
            layoutChild(field, width, height); // lay out the field
            x = x + field.getHeight();
        }
        setExtent(width, height);
    }

如果删除此行x = x+field.getWidth();,则两个文本(Hello User)将重叠 (我认为这是因为x,y = 0)现在我希望我会得到field.getWidth()将返回第一场使用的宽度,而是给我显示的宽度(这是我的想法)所以我的布局中只能看到Hello。

对于垂直定位项目,它可以使用y = y+field,getHeight();正常工作,但不知道为什么getWidth没有返回正确的宽度值,可能我误导了某处理解这个问题。

我是否需要覆盖getPrefferedWidth()方法?我也尝试了这个并保留这个方法,但是它只是在两个字段之间留下了几个空格(2-3)而其他文本重叠了。

2 个答案:

答案 0 :(得分:1)

更新我在更新之前添加了一个基于您的问题和我的答案的完整比例示例(我采用的sublayout()方法保持不变,除了缺少我添加的y变量定义。

当您覆盖子布局时,您应首先布置字段,然后才能定位它们。试试这段代码:

public final class HelloUserScreen extends MainScreen {
    public HelloUserScreen() {        
        Manager customManager = new Manager(0) {
            protected void sublayout(int width, int height) {
                Field field;
                int numberOfFields = getFieldCount();

                int widthUsed = 0;
                int maxHeight = 0;
                int y = 0;

                for (int i = 0; i < numberOfFields; i++) {
                    field = getField(i); // get the field

                    // first layout
                    layoutChild(field, width-widthUsed, height);

                    // then position
                    setPositionChild(field, widthUsed, y);

                    widthUsed += field.getWidth();
                    maxHeight = Math.max(maxHeight, field.getHeight());
                }

                setExtent(widthUsed, maxHeight);
            }
        };

        LabelField helloLabel = new LabelField("Hello ");
        helloLabel.setBackground(BackgroundFactory.createSolidBackground(Color.GREEN)); 
        customManager.add(helloLabel);

        LabelField userLabel = new LabelField("user");
        userLabel.setBackground(BackgroundFactory.createSolidBackground(Color.YELLOW)); 
        customManager.add(userLabel);

        add(customManager);
    }
}

此代码生成以下屏幕

enter image description here

在布局某些字段后,您应该考虑到布局后剩余的可用宽度和高度会变小(在您的情况下,因为您要水平布局字段,主要是宽度问题)。

另一件事是你要调用setExtent()方法,使用实际用于布局字段的宽度和高度,而不是sublayout()中收到的最大宽度和高度(除非你这样做)故意是因为某些特定的UI布局逻辑。)

答案 1 :(得分:0)

您不需要此处的自定义字段。仅使用HorizontalFieldManager并覆盖getPreferredWidth()Field的{​​{1}}。