一个Flex 对话框的坑
最近在项目中遇到一个问题,在Flex中使用Alert.show("this is content!", "title");发现对话框可以弹出来,但是文本始终不显示。why? 由此开始了我苦逼的排查之路。
首先,可以排除没有引入包 import mx.controls.Alert;的问题。如果没有引入包的话,编译会出现错误。所以这一点可以排除掉。
但是这个工程之前就可以弹出对话框啊,为什么现在不能正常弹出呢?系统原生的对话框竟然不起作用!是不是因为文本的css设置有问题呢?比如字体或者颜色的设置造成了文本的不可见?有可能啊。然后自己设置了下css,背景设置为白色,字体设置为红色。重新编译,坐等奇迹的发生。但是对话框除了个框框还是什么都没有!看来css的设置没有起作用。
那会不会被别的css给覆盖了呢?本着这个想法,去工程里面去找,果然,不出我所料,一个css的页面自定义了Alert的样式,然后果断注释了这段代码,重新编译,等待惊喜,失望了,惊喜没有发生。还是以前那个样子。
虽然到目前为止,对话框还是不能正常使用,但是可以肯定一点的是,跟css没有关系。那就只剩下两种可能了:
(1)对话框本身有问题;(2)对话框没有问题,但是系统可能不支持。
对话框本身会有问题么?想到这里,突然想起系统本身其他地方也有使用对话框的啊。
然后仔细看了下以前弹出对话框的代码。有收获,发现之前对话框不是原生的Alert,而是一个被封装的AlertInfo,该AlertInfo继承 了Panel,完成了对对话框的模拟!ok,看到这里,应该比较清楚了,怎么去做一个对话框。用自定义的AlertInfo,去模拟一个对话框。果断
new AlertInfo;重新编译,这回应该是问题不大了。可是没有我想象的那么简单,依然有问题。而且,该系统不仅使用了自定义的AlertInfo,而且使用了原生的Alert。
这下该令人头疼了。原生对话框不能使用,自定义对话框不能使用,就连以前正常可以运行的对话框也无法正常使用了!
有点烦躁。冷静了一下后,开始重新思考面前的问题。目前我正在使用的升级工程,那么我重新建立一个新的文件test.mxml文件,里面只写了一句话:Alert.show("content","title");震精了,竟然也不正常!好吧!使用Flex Builder 重新建立一个Flex项目,新建一个test.mxml文件,发现新项目的可以正常弹出对话框。为何?我仔细比对了两个文件。发现两个mxml的根标签Application就不一样。
升级工程中test.mxml的代码:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml "
layout=" absolute" minWidth=" 955" minHeight="600"
creationComplete="init()">
layout=" absolute" minWidth=" 955" minHeight="600"
creationComplete="init()">
</mx:Application>
新工程中的test.mxml代码:
<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 "
minWidth="955" minHeight="600">
xmlns:s="library://ns.adobe.com/flex/spark "
xmlns:mx="library://ns.adobe.com/flex/mx "
minWidth="955" minHeight="600">
</s:Application>
很显然,两者所引用的库是不一样的。升级工程中是flex3引用的库,而新工程中则是flex4引用的工程,而且两者的标签是不同的,flex3是以<mx:Application></mx:Application>开始,而flex4是以<s:Application></s:Application>开始。为什么会出现这种情况呢?即使是出现这种情况,flex3应该也支持Alert的,那在升级工程中的Alert为啥不正常呢?而且关键是两者使用的都是flex4.1 的sdk。可能跟编译环境有关。看了下两者的编译选项,果然就发现问题了。原来升级工程中使用的兼容flex3的模式。而新项目则没有使用。那在兼容模式下就不能正常使用Alert了?上网谷歌了一下,发现有很多网友也有的问题。原来Flex4和Flex3 的差别还是蛮大的。包括Alert在内的很多控件在兼容模式下都无法正常使用。好吧,既然是兼容因起来的问题,那果断去掉兼容。重新编译,对话框出来了,文本也出来了。所以问题的最终原因不是对话框的问题,是系统环境的原因。可是主工程使用的明明是Flex4,升级工程凭什么搞一个Flex3出来?看了下升级工程的日期,创建日期是2013年7月。为何不和主工程(升级工程算是主工程的一个插件)使用同样的环境?可能前同事出于其他原因的考虑吧,或者说就是无意埋下的坑。好吧,为了为了和主工程保持一致,我将Flex3升级为Flex4,样式由默认的helo该为spark,重新跑一遍程序。看起来是无大碍了。
到此为止,花了整整一天时间,一个Alert只弹框,不显示文本的问题就全部结束了。纵观整个过程,发现问题,分析问题,假设,求证,发现问题的症结,解决问题,最后升级系统。
如果发现问题后,一开始就使用谷歌,可能会减少很多时间去解决这个问题。谷歌虽然强大,但我还是愿意先去自己做一些摸索,做一些分析,万不得以,再去考虑搜索引擎。谁说假设求证不也是一件很愉快的事情呢?虽然这个过程耗费时间会比较长。