Как контролировать класс менеджера в Blackberry - PullRequest
2 голосов
/ 16 марта 2010

Дорогие все, у меня проблема при создании интерфейса на Blackberry.

Сначала я пытаюсь создать класс ChatLayoutManager, расширенный из класса Manager. Мой макет состоит из трех компонентов: 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;
}

}

И теперь, когда я создаю несколько полей (таких как TextField, BitmapField ...), добавленных в ChatField, программа выдает ошибку «Поле не является дочерним для этого менеджера». Причина в том, что платформа вызывает функцию sublayout класса ChatField , когда sublayout начинает вызывать layoutChild функцию, менеджер поля не ChatField , а ChatlayoutManager .

Мне трудно было решить эту проблему, но у меня нет решения. Кто-нибудь может дать мне несколько советов? Я действительно ценю.

Ответы [ 2 ]

4 голосов
/ 16 марта 2010

Ваша функция setContentField (Field []) получает ссылку на предоставленный массив полей, но никогда не добавляет содержимое массива в менеджер (ChatField). Вот почему вы получаете сообщение об ошибке, что поле не является дочерним для этого менеджера.

Во-вторых, что касается подслоя ChatField #, вы должны выполнить одно из следующих действий:

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 напрямую или если вам нужен контроль над конкретным полем, то убедитесь, что менеджер Поля является менеджером разметки:

for(int i = 0 ;i<_contentField.length; i++){
    if(_contentField[i] != null && _contentField[i].getManager() == this){
        // Whatever you need to do to it.
    }
}

Надеюсь, это поможет.

4 голосов
/ 16 марта 2010

Когда вы вызываете Manager.add () (передавая поле), это поле становится дочерним для этого менеджера. Поле может быть только дочерним для одного менеджера - оно не может принадлежать нескольким менеджерам. Если вы получаете эту ошибку, возможно, вы случайно добавили ее к нескольким менеджерам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...