0

タイトルにあるようにgetStringArray()、リソースをコンマではなくセミコロンで分割するように ResourceManager を変更する方法はありますか?

実際のメソッドはResourceManagerImpl、パッケージ内のクラスにありますmx.resourcesgetStringArrayそのメソッドをオーバーライドしても問題ありませんが、理想的には変数セパレーターを使用して独自のメソッドを作成したいと思いますが、ResourceManagerまたはResourceManagerImplクラスを拡張してそのメソッドを何らかの方法で追加する方法はないようです。

ここで何をすべきか手がかりを得た人はいますか?

4

2 に答える 2

2

ResourceManagerImpl問題は、そうではないために拡張できないことではfinalなく、実装をデフォルトのアプリケーションではなくアプリケーションに登録できる必要があることです。そして、これを行うのは少しトリッキーです。

したがって、最初に実装を作成します。

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そのため、メソッドをオーバーライドしました。の代わりに のgetInstance新しいインスタンスを返すようにするため、に対して同じことを行ったことに注意してください (メソッドなのでマークする必要はありません)。また、使用しているクラスの一部が「除外」としてマークされているため、いくつかの import ステートメントを手動で作成する必要がある場合があります。MyResourceManagerResourceManagerImploverridestatic

今度は Flex にMyResourceManagerの代わりに使用するように指示する必要がありResourceManagerImplます。これは、次のコードで実行できます。

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

問題は、Flex が登録される前にこれを行う必要があること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" >

詳細については、かなり似ていますが、別の質問に対して書いたやや精巧な回答を参照してください。ポップアップマネージャークラスでイベントをリッスンする方法はありますか?

于 2012-04-18T09:47:10.160 に答える
0

記録のために: コンマを含む文字列の配列でローカライズを提供したい場合は、 のgetObjectメソッドを使用する方が簡単ですIResourceManager

あなたのプロパティファイルで:

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];

この方法で何もオーバーライドする必要はありません。

于 2014-11-09T10:47:22.170 に答える