时候经常想要调用一个简单的对话框,可能是提示,或输入确认等,但并不想花很多时间去为各种分辨率进行设计。这时候能想到的最便捷的方法就是使用原生弹出对话框。
但 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 上面才变粗一点)。效果到了勉强可以接受的地步。