Наследование с помощью файлов Flex mxml - скриншот прилагается

В мобильном приложении Flex у меня есть 5 View s, обрабатывая входы OAuth через 5 различных социальных сетей, включая Google+ и Facebook. Views выбираются через меню, показанное ниже:

введите описание изображения здесь

Имена файлов: FB.mxml, GG.mxml, MR.mxml, OK.mxml, VK.mxml, а их исходный код очень похож:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        viewActivate="loadInfo(event)"
        viewDeactivate="closeSWV(event)"
        title="Facebook.com">
....
            private function closeSWV(event:Event=null):void {
                _busy.visible = _busy.includeInLayout = false;
                _reload.visible = _reload.includeInLayout = true;

                stage.removeEventListener(Event.RESIZE, resizeSWV);
                if (! _swv)
                    return;
                _swv.removeEventListener(Event.COMPLETE, extractAccessToken);
                _swv.removeEventListener(LocationChangeEvent.LOCATION_CHANGE, extractAccessToken);
                _swv.removeEventListener(IOErrorEvent.IO_ERROR, closeSWV);
                _swv.removeEventListener(ErrorEvent.ERROR, closeSWV);
                _swv.dispose();
                _swv = null;
            }           

            private function resizeSWV(event:Event=null):void {
                if (! _swv)
                    return;
                // align to the right-bottom corner
                _swv.viewPort = new Rectangle(stage.stageWidth - Preferans.SCALE * width, 
                    stage.stageHeight - Preferans.SCALE * height, 
                    Preferans.SCALE * width, 
                    Preferans.SCALE * height);
            }
....
        <s:VGroup>
            <s:Label id="_first"  fontWeight="bold" text="Your name:" />
            <s:Label id="_gender" fontWeight="bold" text="Gender:" />
            <s:Label id="_city"   fontWeight="bold" text="City:" />
        </s:VGroup>

    <s:Button id="_play"
              label="Play" 
              click="startGame(event)"
              includeInLayout="false"
              visible="false" />
</s:View>

Моя проблема: перечисленные выше 5 файлов mxml имеют много похожих методов, переменных и элементов пользовательского интерфейса и лишь несколько различных методов и переменных.

Я уже несколько раз пытался ввести для них «базовый класс» и всегда сдавался, потому что это непросто для файлов mxml (по сравнению с чистыми классами AS3).

У кого-нибудь есть идея, как подойти к этому?


person Alexander Farber    schedule 03.02.2013    source источник


Ответы (1)


Вы можете определить абстрактный класс, который расширяет компонент пользовательского интерфейса, который вы хотите использовать в каждой строке списка. В вашем случае он продлится View.

package your.package{
    public class SocialAccountView extends View{

        // in this class you can add the generic methods
        // that you want the view to have

    }
}

После этого в файле mxml вы можете использовать созданный вами класс в качестве основного типа вместо View

<your.package:SocialAccountView
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    viewActivate="loadInfo(event)"
    viewDeactivate="closeSWV(event)"
    title="Facebook.com">

</your.package:SocialAccountView>

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

Что касается компонентов пользовательского интерфейса, максимальный уровень абстракции (о котором я знаю), который вы можете использовать с ними, - это создать дополнительный компонент и использовать его во всех представлениях. Что-то типа...

Labels.mxml

    <s:VGroup>
        <s:Label id="_first"  fontWeight="bold" text="Your name:" />
        <s:Label id="_gender" fontWeight="bold" text="Gender:" />
        <s:Label id="_city"   fontWeight="bold" text="City:" />
    </s:VGroup>

а затем используйте его в каждом компоненте, например

<your.package:Labels 
              id="labelsComponent"/>

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

person nakib    schedule 03.02.2013
comment
Спасибо, но куда (в каком файле) добавить общие элементы пользовательского интерфейса, такие как _name, _gender, _city Labels, перечисленные в моем вопросе? - person Alexander Farber; 03.02.2013