更改ResourceManager以分号分隔值,而不是逗号

时间:2012-04-18 09:17:03

标签: actionscript-3 flex mobile flex4 resourcebundle

正如标题所说,有没有办法改变ResourceManager的getStringArray(),使其以分号而不是逗号分割资源?

实际方法可以在ResourceManagerImpl类中找到,该类可以在包mx.resources中找到。 覆盖该方法会没问题,但理想情况下我想用可变分隔符编写自己的getStringArray,但似乎无法扩展ResourceManagerResourceManagerImpl以某种方式添加该方法的类。

任何人都知道该怎么做?

2 个答案:

答案 0 :(得分: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执行了相同操作,因为我们希望它返回MyResourceManager而不是ResourceManagerImpl的新实例(我们不必标记override因为它是static方法。此外,您可能必须手动编写一些导入语句,因为您使用的某些类被标记为“已排除”。

现在我们必须告诉Flex使用MyResourceManager而不是ResourceManagerImpl。我们可以使用以下代码执行此操作:

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

问题是我们必须在Flex注册ResourceManagerImpl之前执行此操作,因为一旦注册它就无法覆盖它。为此我们需要创建一个自定义预加载器,我们在其中进行注册(遗憾的是,应用程序的'preinitialize'阶段还不够早。)

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?

答案 1 :(得分:0)

仅供记录:如果您希望为本地化提供包含逗号的字符串数组,则使用getObject的{​​{1}}方法会更容易。

在您的属性文件中:

IResourceManager

在您的代码中:

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

你不必以这种方式覆盖任何东西。