2012-04-18 1 views
0

제목에서 알 수 있듯이 쉼표가 아닌 세미콜론으로 리소스를 분할하는 방식으로 ResourceManager의 getStringArray()을 변경하는 방법이 있습니까?쉼표가 아닌 세미콜론으로 값을 나누려면 ResourceManager를 변경하십시오.

실제 방법은 mx.resources 패키지에있는 ResourceManagerImpl 클래스에서 찾을 수 있습니다. 해당 메서드를 재정의하는 것이 좋지만 이상적으로는 변수 구분 기호로 내 getStringArray을 작성하고 싶습니다. ResourceManager 또는 ResourceManagerImpl 클래스를 확장하는 방법이없는 것 같습니다.

누구나 단서가 있습니까?

답변

2

ResourceManagerImplfinal이 아니기 때문에 확장 할 수있는 것이 아니라, 기본 구현 대신 애플리케이션으로 구현을 등록 할 수 있어야한다는 점이 문제입니다. 그리고 이것을하는 것은 약간 까다 롭습니다.

그래서 먼저 구현을 작성합니다

public class MyResourceManager extends ResourceManagerImpl { 

    private static var instance:IResourceManager; 

    static public function getInstance():IResourceManager 
    { 
     if (!instance) instance = new MyResourceManager(); 
     return instance; 
    } 

    override public function getStringArray(bundleName:String, 
              resourceName:String, 
              locale:String = null):Array { 
     //do your stuff 
    } 

} 

그래서 우리는 getStringArray 방법을 재정의했습니다. 에 대해서도 동일한 작업을 수행했음을 알 수 있습니다. ResourceManagerImpl 대신 MyResourceManager 대신 새 인스턴스를 반환하기를 원하기 때문입니다 ( static 메서드이므로 override으로 표시하지 않아도됩니다). 또한 사용중인 클래스 중 일부가 '제외됨'으로 표시되어 일부 import 문을 수동으로 작성해야 할 수도 있습니다.

이제는 ResourceManagerImpl 대신 MyResourceManager을 사용하도록 Flex에 알려야합니다. 우리는 다음 코드를 사용하여이 작업을 수행 할 수 있습니다

import mx.core.Singleton; 
Singleton.registerClass("mx.resources::IResourceManager", MyResourceManager); 

문제는 우리가 플렉스하기 전에이 작업을 수행해야한다는 것입니다 ResourceManagerImpl를 등록이 등록되어 일단 당신이 그것을 무시할 수 없습니다 때문입니다. 이를 위해 등록을 수행하는 사용자 정의 프리 로더를 생성해야합니다 (슬프게도 응용 프로그램의 '사전 초기화'단계가 빠르지 않습니다).

public class RegisteringPreloader extends DownloadProgressBar { 

    override public function initialize():void { 
     super.initialize(); 
     Singleton.registerClass("mx.resources::IResourceManager", 
           MyResourceManager); 
    } 

} 

이제 응용 프로그램에 사용자 정의 프리 로더를 할당하고 우리는 완료 : 추가 정보에 대한

<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" 
       preloader="RegisteringPreloader" > 

나는 다른에 대해 쓴 상당히 유사하지만 좀 더 정교한 대답에 당신을 참조 질문 : 그냥 레코드에 대한 Is there a way to listen for events on the pop up manager class?

+0

와우, 나는 그런 상세한 대답을 기대하지 않았다! 정말로 당신의 도움에 감사드립니다. 나는 곧바로 그것을 얻을 것이다.앱의 사전 단계에서 현재하고있는 다른 로딩 요소들에 대해'RegisteringPreloader' 클래스를 사용할 수 있습니다. 다시 한 번 감사드립니다! – AlBirdie

+0

좋아, 약간의 조정이 끝난 후 (나는 당신의 코드를 편집하여 자유롭게 편집 주석을 볼 수 있기를 희망했다.), 나는 ResourceManager의 실제 구현에 매달려있다. 내 getStringArrayBySeparator 함수를 호출하려고하면 오류 1061 (정의되지 않은 메서드)이 발생합니다. 변수 선언은 다음과 같습니다 :'var _resourceMan : IResourceManager = MyResourceManager.getInstance();'그리고 물론'_resourceMan.getStringArrayBySeparator '의 호출. – AlBirdie

+0

사실, 메서드가 IResourceManager 인터페이스에 의해 정의되지 않았기 때문에 내 자신의 메서드를 추가 할 수 없다는 것을 알았습니다. 그러므로 찾을 수 없습니다. 동일한 이유로 인해 다른 변수를 추가하지 않으면 내 자신만으로 getStringArray 메소드를 대체하는 것이 가능하다고 가정합니다. 그것은 좋은 기능이지만, 간단한 오버 라이드로 할 수 있고 단지 쉼표를 세미콜론으로 바꿀 수 있습니다. – AlBirdie

0

: 당신이 쉼표를 포함하는 문자열 배열하여 현지화를 제공하려는 경우, IResourceManagergetObject 방법을 사용하는 방법은 쉽다. 당신의 재산에

파일 :

my.beloved.strings: ["That's it, string one", "Okay, string two"] 

코드에서 :

var strings:Array = _resourceManager.getObject(_bundleId, 'my.beloved.strings') as Array; 
var stringOne:String = strings[0]; 

당신은 무엇이든이 방법을 재정의 할 필요가 없습니다.

관련 문제