0

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

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

有人知道在这里做什么吗?

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,因为我们希望它返回一个新的实例,MyResourceManager而不是ResourceManagerImpl(我们不必标记override,因为它是一个static方法)。此外,您可能必须手动编写一些导入语句,因为您正在使用的某些类被标记为“排除”。

现在我们必须告诉 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 回答