时候经常想要调用一个简单的对话框,可能是提示,或输入确认等,但并不想花很多时间去为各种分辨率进行设计。这时候能想到的最便捷的方法就是使用原生弹出对话框。

但 AS3 并没有提供这些原生的便利,不能直接调用原生的对话框功能,需要通过 ANE 才能实现。但客户端的 JS 环境提供了很多的便利,因为 AIR 在移动设备上使用 StageWebView 类时调用的直接就是系统浏览器控件。所以实际上不需要通过 ANE ,只需要通过 JS 就能间接的调用原生的弹出对话框。

代码 + 截图,然后再对效果加以改进。以下以 iOS 8 环境中的截图为样例(已经测试过在 iOS 7 和 8 上都完全正常,效果稍有不同后面说明,安卓机上没有去测试,反正代码都一样,有需要的可以自己去测一下。

备注:如何通过 AS 运行 JS 并读取 JS的返回值参考《读取 iOS 屏幕物理点数完整样例代码》贴子有完整样例代码。

JS 字符串代码:

var str 
 :String 
 = 
 ( 
 < 
 ! 
 [CDATA 
 [ 
 
     
 <script type 
 = 
 "text/javascript" 
 > 
 
    alert 
 ( 
 "Hello,你好" 
 ); 
 
    confirm 
 ( 
 "Hello,你好" 
 ); 
 
     
 var name 
 =prompt 
 ( 
 "Hello,你好,叫什么名字?", 
 "匿名" 
 ); 
 //将输入的内容赋给变量 name , 
 
     
 //这里需要注意的是,prompt有两个参数,前面是提示的话,后面是当对话框出来后,在对话框里的默认值 
 
     
 < 
 /script 
 > 
 
] 
 ] 
 > 
 );


在 iOS 设备上运行看效果(点击图片可以看大图):

  

恩,完全可以使用,但发现它的标题是 “http://adobe.1437011307.apollo.air”,效果太差了,Google 了一下之后没有发现可以修改的方法,囧 - - 。但是还是找到了一个去掉标题的方法,继续往下,把 JS 代码修改成下面这样子:

var str 
 :String 
 = 
 ( 
 < 
 ! 
 [CDATA 
 [ 
      
 <script type 
 = 
 "text/javascript" 
 > 
          
 var iframe 
 = document.createElement 
 ( 
 "IFRAME" 
 ); 
         iframe.setAttribute 
 ( 
 "src", 
 "data:text/plain;" 
 ); 
         document.documentElement.appendChild 
 (iframe 
 ); 
         window.frames 
 [ 
 0 
 ].window.alert 
 ( 
 "Hello,你好" 
 ); 
         window.frames 
 [ 
 0 
 ].window.confirm 
 ( 
 'Hello,你好' 
 ); 
         window.frames 
 [ 
 0 
 ].window.prompt 
 ( 
 'Hello,你好,叫什么名字?', 
 "匿名" 
 ); 
         iframe.parentNode.removeChild 
 (iframe 
 ); 
      
 < 
 /script 
 > 
 ] 
 ] 
 > 
 );


再运行看看效果:

  

标题消失了,仔细一点看,这个没有标题的弹出对话框中文字,相对于前面带有标题的对话框而言文字变粗了一点(在 iOS 7 上它并不会变粗,在 iOS 8 上面才变粗一点)。效果到了勉强可以接受的地步。