Дочерний контейнер компонента аккордеона ActionScript 3 накладывается друг на друга

Я использую список аккордеонов в as3 для отображения информации о кластере маркеров на карте Google. По какой-то причине текущий выбранный дочерний контейнер (vbox) частично перекрывается меткой следующего контейнера. И кажется, что чем длиннее список аккордеона, тем больше площадь контейнера будет покрыта. Я попытался установить для свойства resizeToContent значение true/false, но ничего не работает. Вот пользовательский класс аккордеона (list — это массив объектов маркерного информационного окна, который также расширяет UIComponent):

package{
         import mx.containers.Accordion;
          ...
public class AccordionWindow extends UIComponent{ 

public function AccordionWindow(list:Array){

        var panel:Box = new Box();
        panel.width = 300;
        panel.height = 200;
        addChild(panel);

        var acc:Accordion = new Accordion();
        acc.percentWidth = 100;
        acc.percentHeight = 100;

        for (var i:int = 0; i < list.length; i++)
        {
            var vbox:VBox = new VBox();
            vbox.label = "Item" + String(i);
            vbox.addChild(list[i]);
            acc.addChild(vbox);
        }

        panel.addChild(acc);
   }
}

Любые идеи?


person saurb    schedule 16.11.2009    source источник


Ответы (1)


Я не уверен, в чем именно причина вашей проблемы, но вот несколько мыслей, которые должны помочь.

  1. Вам нужно запустить свой конструктор с оператором super().

    public function AccordionWindow(list:Array)
    {
        super();
    
    
        // any other code you might have in your constructor.  
        // generally, you'll want to store arguments in instance properties.  
        // maybe something like this:
    
           this.list = list;
    
    }

Извините - не знаю, почему у меня столько проблем с форматированием кода...

  1. Судя по опубликованному вами коду, похоже, что класс AccordionWindow предназначен для создания Accordion и помещения его в коробку. Возможно, у вас есть конкретная потребность делать что-то так, как вы пытаетесь это сделать, но, по моему опыту, было бы лучше расширить Box, а не UIComponent.

  2. Вы, как правило, сталкиваетесь с проблемами при создании дочерних элементов и добавлении их на сцену в конструкторе. Вместо этого переопределите защищенный метод createChildren и переместите весь код, который у вас есть в конструкторе, в этот метод.

createChildren вызывается автоматически, поэтому вам не нужно ничего делать, кроме как переопределить его и переместить в него свой код.

override protected function createChildren():void
{
    super.createChildren();  // very important.  do not leave this out.

    // paste the code that is currently in the constructor here
}

Существует очень полезная статья о жизненном цикле UIComponent по адресу http://danorlando.com/?p=122.

person Ross Henderson    schedule 18.11.2009
comment
Большое спасибо за ответ. Это очень полезно. Недавно я сам понял, что мне просто нужно установить явное значение MinHeight для каждого дочернего элемента в аккордеоне. Еще раз спасибо! - person saurb; 20.11.2009
comment
Без проблем. Да, вы можете сделать это, но вы в основном работаете против того, как функционируют UIComponents. Если вы обнаружите, что у вас начинаются похожие проблемы или проблемы с макетом, которые не имеют никакого смысла, я определенно рекомендую вернуться и использовать метод createChildren. Удачи! - person Ross Henderson; 20.11.2009