您的位置:首页 > 移动开发

发现flex的bug——DateField属性formatString中文资源文件有问题导致DateField工作异常

2011-09-16 22:35 316 查看
今天遇到一个非常奇怪的问题。
请看如下一段非常简单的代码:
<mx:DateField id="testDf"/>
<s:Button click="trace(testDf.selectedDate)"/>
目的就是打印日期组件testDf当前选中的日期。
 
接下来进行的操作就是:选择一个日期后,点击按钮查看打印结果。(也请您试试您的打印结果是什么)
我的打印结果:
在我们的项目工程中新建Application(Test1.mxml)并拷贝这两行代码:打印结果为null。
在我的测试工程中为新建Application(Test2.mxml)并拷贝这两行代码:打印结果为"Fri Sep 16 00:00:00 GMT+0800 2011"。
(以下文字中使用Test1代表我们项目中我新建的Application,Test2代表我的另外一个测试工程。)
 
我非常困惑:这么简单的两行代码,为什么在两个工程中打印的结果不一样呢?问遍周围的高手都觉得奇怪,于是我决定研究下这个问题。
 
问题分析:
1.我首先检查了两个工程的SDK和Flash Player版本,都是一样的:SDK4.5.1,Flash Player10.0
2.看代码一模一样。 难道就因为放到我们的项目工程中就出现了这个问题?可是它只是一个新建的Application,跟我们的项目有什么关系呢?
3.既然结果摆着眼前,说明确实受项目影响了,那就debug到SDK看看到底差哪了。果然还发现了不同:Test1中DateField的formatString属性值为YYYY-M-D,Test2中DateField中formatString属性值为MM/DD/YYYY。注意我没有为DateField组件设置formatString属性,即formatString的值为默认值。那么此时已经可以解释为什么两个工程的打印结果不同了:Test1中格式化字符串为YYYY-M-D,而点击DateField弹出DateChooser时会根据DateField上显示的日期字符串设置_selectedDate属性,而这个字符串根本就无法按照格式YYYY-M-D解析,因此为null。而在Test2中格式化字符串正确,自然可以正常获得_selectedDate。
4.从第一个层面解释了这个问题,可是到底是什么原因导致我们项目中DateField的formatString的默认值为YYYY-M-D。继续跟踪SDK发现formatString的默认值是从国际化资源文件中获得(可以参考SDK中DateField.as源文件),截取如下代码为证:_formatString= value!=null ? value : resourceManager.getString("SharedResources", "dateFormat");两段相同的代码在不同的工程中调用相同的SDK从国际化资源文件中取出来的formatString值却不同!
5.于是我想到了我们项目中使用了国际化,一定是国际化惹的祸。……我的分析定位过程………此处省略一万字,直接说结论………
6.我的Flash builder安装的英文版,因此新建的工程默认的国际化资源文件是取英文的,而英文的国际化资源文件中formatString为MM/DD/YYYY(查找资源文件的路径:sdks\4.5.0\frameworks\projects\framework\bundles\en_US\SharedResources.properties)。而我们的项目中定义了中文和英文的国际化资源文件,并且添加了如下编译参数:-locale=en_US,zh_CN(编译参数的配置位置window\perference\flex
compiler\additional compiler arguments)。因此在编译test1所在项目时预编译了两种国际化资源文件。那么实际显示时显示哪种呢?难道是:-locale=en_US,zh_CN中靠前的?显然不是,从SDK中ResourceManagerImpl.as类中分析可知,国际化资源文件优先显示Capabilities类中language属性指定的语言(Capabilities类提供一些属性描述承载swf文件的系统和播放器参数)。我的电脑当前语言当然是中文啦。
7.至此,100%断定肯定是中文国际化资源的问题。可打开文件sdks\4.5.0\frameworks\projects\framework\bundles\zh_CN\SharedResources.properties进行验证。
 
总结:导致此问题的原因就是flex4.5 SDK中文国际化资源文件formatString为YYYY-M-D,因此不能正确把DateField文本框中日期字符串转化为selectedDate。规避办法当然很简单了:要么就是只用英文国际化资源文件(实际中那是不可能的),要么就手动设置formatString属性(看了下大家的代码发现都是设置的formatString属性,看来大家早就发现了这个问题,只是没有深入分析原因罢了)。
 
反思:adobe是不是不应该犯这样的错?一个小小的国际化资源文件竟然导致界面显示错误。这也不是我第一次发现flex SDK4.5的错了,flex的稳定性有待时日考验啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息