正如标题所说,有没有办法改变 ResourceManager 的getStringArray()
方式,它用分号而不是逗号分割资源?
实际方法可以在ResourceManagerImpl
类中找到,可以在包中找到mx.resources
。覆盖该方法会很好,但理想情况下我想getStringArray
用变量分隔符编写自己的方法,但是,似乎没有办法扩展ResourceManager
orResourceManagerImpl
类以某种方式添加该方法。
有人知道在这里做什么吗?
正如标题所说,有没有办法改变 ResourceManager 的getStringArray()
方式,它用分号而不是逗号分割资源?
实际方法可以在ResourceManagerImpl
类中找到,可以在包中找到mx.resources
。覆盖该方法会很好,但理想情况下我想getStringArray
用变量分隔符编写自己的方法,但是,似乎没有办法扩展ResourceManager
orResourceManagerImpl
类以某种方式添加该方法。
有人知道在这里做什么吗?
问题不在于您不能扩展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" >
有关更多信息,我向您推荐了一个非常相似但更详细的答案,我为另一个问题写了:有没有办法在弹出管理器类上监听事件?
仅作记录:如果您想为本地化提供包含逗号的字符串数组,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];
您不必以这种方式覆盖任何内容。