亲爱的所有人,我在Blackberry上创建UI时遇到了问题。
首先,我尝试创建一个从Manager类扩展的ChatLayoutManager类。我的布局有三个组成部分:topfield,mainfield和bottom field。
public class ChatLayoutManager extends Manager {
private Field bottomField;
private Field mainField;
private Field titleField;
public ChatLayoutManager(long style) {
super(style);
}
protected void sublayout(int width, int height) {
setExtent(width, height);
int y = 0;
if (bottomField != null) {
layoutChild(bottomField, width, height);
// This goes at the bottom of the screen
setPositionChild(bottomField, 0, height-bottomField.getHeight());
height -= bottomField.getHeight();
}
if (titleField != null) {
layoutChild(titleField, width, height);
// This goes at the top of the screen
setPositionChild(titleField, 0, 0);
height -= titleField.getHeight();
y += titleField.getHeight();
}
if (mainField != null) {
layoutChild(mainField, width, height);
// This goes just below the title field (if any)
setPositionChild(mainField, 0, y);
}
}
public void setMainField(Field f) {
mainField = f;
add(f);
}
public void setBottomField(Field f) {
bottomField = f;
add(f);
}
public void setTitleField(Field f) {
titleField = f;
add(f);
}
然后我创建另一个从管理器扩展的字段(ChatField),以添加到我在上面创建的ChatLayoutManager类中的主域。
public class ChatField extends Manager{
private Field _contentField[];
protected ChatField(){
super(Manager.HORIZONTAL_SCROLL | Manager.VERTICAL_SCROLL);
}
// TODO Auto-generated constructor stub}
protected synchronized void sublayout(int width, int height) {
// TODO Auto-generated method stub
setExtent(width, height);
int x = 0;
int y = 0;
if(_contentField.length > 0){
for(int i = 0 ;i<_contentField.length; i++){
//if(getManager() == this){
this.layoutChild(_contentField[i],
_contentField[i].getWidth(),
_contentField[i].getHeight());
this.setPositionChild(_contentField[i], x, y);
if(_contentField[i++]!= null){
if ((_contentField[i].getWidth() + _contentField[i].getWidth())
>= width){
x = 0;
y += _contentField[i].getHeight();
}
else{
x += _contentField[i].getWidth();
}
}
//}
}
}
}
public void setContentField(Field field[]){
_contentField = field;
}
}
现在,当我创建一些添加到ChatField的字段(例如TextField,BitmapField ...)时,程序会出现错误“字段不是此管理器的子项”。原因是,当子布局开始调用 layoutChild 函数时,框架会调用 ChatField 类的子布局函数字段管理员不是 ChatField ,而是 ChatlayoutManager 。
我在尝试解决此问题时遇到了困难,但仍然无法解决问题。有人可以给我一些建议吗?我真的很感激。
答案 0 :(得分:4)
当您调用Manager.add()(传入Field)时,该字段将成为该经理的子级。字段只能是单个Manager的子项 - 它不能属于多个Manager。如果您收到该错误,那么您可能会意外地将其添加到多个Manager中。
答案 1 :(得分:4)
你的setContentField(Field [])函数获取对所提供的字段数组的引用,但它从不将数组的内容添加到管理器(ChatField)。这就是为什么你得到该字段不是该经理的孩子的错误。
其次,关于您的ChatField #sublayout,您应该执行以下操作之一:
1)不要直接引用_contentField数组,而是使用Manager提供的功能来引用其子代:
int numFields = getFieldCount(); // getFieldCount() is a member of Manager
int marginHorizontal = 0;
for(int i = 0; i < numFields; i++) {
field = getField(i); // getField() is a member of Manager
// Whatever you need to do to it.
}
2)如果您仍然希望直接引用_contentField,或者您需要控制特定字段,那么请确保Field的经理是正在布局的经理:
for(int i = 0 ;i<_contentField.length; i++){
if(_contentField[i] != null && _contentField[i].getManager() == this){
// Whatever you need to do to it.
}
}
希望这有帮助。