0

我对黑莓非常陌生,并试图制作一个自定义管理器。所以我试图让布局变得非常简单,它将显示两个标签字段。(我可以很容易地通过将它们都放在 Horizo​​ntalFieldManager 中来获得这个,但我需要使用自定义管理器来做到这一点。)

输出应该是这样的: -Hello(FirstField) User(SecondField)

这是我班级中的子布局方法,它扩展到 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),其他文本重叠。

4

2 回答 2

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);
    }
}

此代码产生以下屏幕

在此处输入图像描述

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

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

于 2012-05-10T19:40:03.430 回答
0

您不需要此处的自定义字段。对and使用 justHorizontalFieldManager和 override 。getPreferredWidth()Fieldreturn getScreen().getWidth() / 2

于 2012-05-10T14:58:42.513 回答