2012-05-10 43 views
0

我对黑莓手机非常陌生,试图制作一个自定义管理器。所以我试图让布局非常简单,它会显示两个Labelfields(我可以非常容易地将它们都放到Horizo​​ntalFieldManager中,但我需要使用自定义管理器来完成此操作。)设置自定义管理器中的字段宽度

Out out should是这样的: - Hello(FirstField) User(SecondField)

这里是我的课堂我sublayout方法,扩展到经理

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();然后两种文本(你好用户)将被重叠 (我认为这是因为x,y = 0)现在我希望我会得到field.getWidth()将返回字段一使用的宽度,但它给我的显示宽度(这是我的想法),所以我只能在布局中看到Hello。

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

我需要重写getPrefferedWidth()方法?我也尝试过这种方法,并保持原样,但是在两个字段和其他文本之间留下少量空格(2-3)。

回答

1

更新:我添加了基于你的问题,更新前我的回答满刻度的例子(我已经采取了sublayout()方法仍然只是,我已经失踪y变量定义相同添加)。

当你重写sublayout,你应该首先布局的领域,然后才放置它们。试试这个代码:

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布局的最大宽度和高度逻辑)。

+0

我认为y将在setPositionChild方法中是maxHeight。我试过了,但是它在整个屏幕上仍然只显示出一个元素。 –

+0

@ R.j。你只在这里发布了一部分代码。字段的定义丢失 - 发布。您描述的行为可能是由使用所有可用宽度的字段造成的。在任何情况下,正如我在答复中所说的那样 - 您应该首先布置这些字段,而不仅仅是定位它们(​​否则,您将在它们的宽度和高度尚未确定之前尝试对它们进行定位)。 – mrvincenzo

+0

嗨,我只在我的自定义管理器类中重写此方法,并有一个构造函数,我编辑了我的代码。 –

0

您不需要这里的自定义字段。在那里仅使用HorizontalFieldManager并且覆盖getPreferredWidth()来代替Fieldreturn getScreen().getWidth()/2

+0

你好尤金,是的,我可以很容易地通过水平经理实现这一点,但我要实现自定义的经理,我发现这个例子很容易实现,并知道我可以在黑莓实现定制设计所以这就是为什么我这样做通过扩展经理类。 –

相关问题