Как получить доступ к дочерним элементам tabNavigator, созданного с помощью ActionScript во время выполнения? - PullRequest
2 голосов
/ 06 января 2011

Я создаю объект tabNavigator в mxml.

TabNavigator содержит объекты navigatorContent.

Каждый NavigatorContent дополнительно содержит несколько hGroups с тремя переключателями в нем.

Все эти элементы заполняются в tabNavigator с помощью кода ActionScript динамически.

Мне нужно выбрать второепереключатель в группе, но я не уверен, как это сделать.

<mx:TabNavigator id="tabNav" height="100" width="500" creationComplete="init();" creationPolicy="all"> 
</mx:TabNavigator> 

private function init():void
{
    for(var i:int=0;i<=int(arrColl_items[arrColl_items.length - 1][1]);
    i++)
    {
        //after reading from xml var navContent:NavigatorContent = new NavigatorContent();
        for (var j:int=0;j<arrColl_items.length;j++)
        {
            if(arrColl_items[j][1] == i)
            {
                var hgrp:HGroup = new HGroup();
                hgrp.id = String(arrColl_items[j][0]);
                var rdBut1:RadioButton=new RadioButton();
                hgrp.addElement(rdBut1);
                rdBut1.addEventListener(MouseEvent.CLICK, setrdBut1);
                var rdBut2:RadioButton=new RadioButton();
                hgrp.addElement(rdBut2);
                rdBut2.addEventListener(MouseEvent.CLICK, setrdBut2);
                var rdBut3:RadioButton=new RadioButton();
                hgrp.addElement(rdBut3);
                rdBut3.addEventListener(MouseEvent.CLICK, setrdBut3);
            }
        }
        navContent.addElement(hgrp);
        tabNav.addChildAt(navContent,i);
    }
}

Может кто-нибудь помочь с этим?

С уважением

Апарна

1 Ответ

0 голосов
/ 01 июля 2011

вы не опубликовали структуру данных, надеюсь, я правильно понял. Следующая демонстрация создает и заполняет TabNavigator тремя экземплярами NavigatorContent, содержащими серии RadioButton, которые можно выбрать с помощью метода getHGroupById. Я уверен, что можно реализовать нечто подобное, используя Bindable Data и ItemRenderes, возможно, лучшее решение. * Николай

Применение:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <mx:TabNavigator id="tabNav" height="300" width="300" creationComplete="__init();" creationPolicy="all"> 
    </mx:TabNavigator> 
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;          
            import spark.components.NavigatorContent;
            import spark.components.VGroup;

            /**
             * The Data Structure, as I understood it
             * perhaps you have to adapt the code if
             * this does not match your desired structure
             * or hierarchy
             * */
            private var arrColl_items:ArrayCollection = new ArrayCollection(
                [
                    new ArrayCollection(                
                        // 1st NavigatorContent
                        [
                            {id:"0",label:"HGroup_1.1"},
                            {id:"1",label:"HGroup_1.2"}
                        ]
                    ),
                    new ArrayCollection(                        
                        // 2nd NavigatorContent
                        [
                            {id:"2",label:"HGroup_2.1"},
                            {id:"3",label:"HGroup_2.2"},
                            {id:"4",label:"HGroup_2.3"}
                        ]
                    ),
                    new ArrayCollection(
                        // 3rd NavigatorContent
                        [
                            {id:"5",label:"HGroup_3.2"},
                            {id:"6",label:"HGroup_3.3"},
                            {id:"7",label:"HGroup_3.4"},
                            {id:"8",label:"HGroup_3.5"},
                            {id:"9",label:"HGroup_3.5"}
                        ]
                    )

                ]
            );

            /**
             * Invoked on creationComplete
             * */
            private function __init():void
            {
                // lets add some navigatorContent
                for(var i:int=0;i<arrColl_items.length;i++){
                    // create the navigatorContent
                    var navContent:NavigatorContent = new NavigatorContent();                   
                    navContent.label = "navContent_"+i;

                    // add a VGroup
                    var vgrp:VGroup = new VGroup();
                    vgrp.id = "vGroup";

                    // and now we add custom HGroup Components called MyHGroup  
                    for (var j:int=0;j<arrColl_items[i].length;j++)
                    {
                        var hgrp:MyHGroup = new MyHGroup();
                        hgrp.id = arrColl_items[i][j].id;
                        hgrp.label.text = arrColl_items[i][j].label;                        
                        vgrp.addElement(hgrp);
                    }                   
                    navContent.addElement(vgrp);
                    tabNav.addElementAt(navContent,i);
                }

                // Accessing the radioButtons is now possible
                // using the getHGroupById Method
                getHGroupById("0").rb1.selected = true;
                getHGroupById("1").rb2.selected = true;
                getHGroupById("3").rb3.selected = true;
                getHGroupById("7").rb1.selected = true;

                // I added a RadioGroup within MyHGroup, lets read the selectedValue
                trace(getHGroupById("0").rbGroup.selectedValue);
            }


            /**
             * getHGroupById
             * Method that runs through the Data Structure
             * and returns a MyHGroup Class with the given id
             * @param $id:String The id of the MyHGroup Class you want to fetch
             * @return MyHGroup or null if non existent
             * 
             * */
            public function getHGroupById($id:String):MyHGroup{
                // running through the NavigatorContent Instances
                for(var i:uint=0; i<tabNav.numElements; i++){
                    var navContent:NavigatorContent = NavigatorContent(tabNav.getElementAt(i));                 
                    // running through the HGroups within a VGroup
                    for(var j:uint=0; j<VGroup(navContent.getElementAt(0)).numElements; j++){                       
                        var hgrp:MyHGroup = VGroup(navContent.getElementAt(0)).getElementAt(j) as MyHGroup;                     
                        if(hgrp.id==$id)return hgrp;
                    }
                }
                return null;
            }
        ]]>
    </fx:Script>    
</s:Application>

Наконец, компонент MyHGroup, используемый в этом примере. Создайте новый файл MXML с именем MyHGroup.mxml и вставьте следующий код.

<?xml version="1.0" encoding="utf-8"?>
<!-- Create a new MXML File name MyHGroup and add this code -->
<s:HGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
          xmlns:s="library://ns.adobe.com/flex/spark" 
          xmlns:mx="library://ns.adobe.com/flex/mx" width="200" height="20" paddingLeft="10" >

    <fx:Declarations>               
        <!-- The RadioGroup the Buttons will be linked with -->
        <s:RadioButtonGroup id="rbGroup"/>          
    </fx:Declarations>

    <!-- Some fancy label -->
    <s:Label id="label" height="20" verticalAlign="middle"/>

    <!-- Your Radio Buttons -->
    <s:RadioButton id="rb1" group="{rbGroup}"/>
    <s:RadioButton id="rb2" group="{rbGroup}"/>
    <s:RadioButton id="rb3" group="{rbGroup}"/>
</s:HGroup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...