正如标题所说,有没有办法改变ResourceManager的getStringArray()
,使其以分号而不是逗号分割资源?
实际方法可以在ResourceManagerImpl
类中找到,该类可以在包mx.resources
中找到。
覆盖该方法会没问题,但理想情况下我想用可变分隔符编写自己的getStringArray
,但似乎无法扩展ResourceManager
或ResourceManagerImpl
以某种方式添加该方法的类。
任何人都知道该怎么做?
答案 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"]
你不必以这种方式覆盖任何东西。