【发布时间】:2013-04-05 18:01:13
【问题描述】:
有哪些选项可用于使用 Adobe AIR 在 Android 上处理文本输入?每个选项的优缺点是什么?
【问题讨论】:
标签: android mobile air adobe textinput
有哪些选项可用于使用 Adobe AIR 在 Android 上处理文本输入?每个选项的优缺点是什么?
【问题讨论】:
标签: android mobile air adobe textinput
Android 上的 AIR 开发人员可用于处理文本输入的当前选项有:
我将在下面讨论每种方法的一些优点和缺点。如果我遗漏了什么(或者如果您有其他我没有想到的想法),请告诉我!
默认情况下,在移动设备上运行的 TextInputs 使用 StageText(本机文本)进行输入。正如 Adobe 所概述的那样,StageText 提供了几个优点 in their online documentation,包括自动更正、软件键盘的自定义等。
bugbase ticket 3302441 中描述了使用 StageText 的最大缺点。当用户滚动时,StageText 的定位会被破坏。文本字段出现在它们各自的 TextInputs 之外,或者更糟糕的是,出现在其他 TextInputs 之内。此缺陷的唯一解决方法是设计一个不允许滚动的 UI。显然,这对于手机和平板手机来说是非常困难的。
此组件在内部使用 StyleableTextField。它针对移动使用进行了优化。
当用户在某些 Android 版本(例如运行 Android 2.3 的 Nook、运行 Android 4.0 的 Kindle HD)上键入时,此组件会在 TextInput 中插入额外的任意字符。请参阅 bugbase ticket 3547601。
如果您的应用程序仅本地化为英语(或基于拉丁语的语言)并且不需要支持较旧的 Android 版本,那么此组件可能适合您。
此组件在内部使用 RichEditableText。它没有针对移动使用进行优化。除此之外,它还展示了一些使其不适合使用的缺陷(如上所列)。
此组件无法正确处理某些双字节字符(在韩语等语言中)。这些字符似乎被插入到 TextInput 中(光标在进步,可见),但没有向用户呈现文本。 (使用嵌入字体可能会解决此问题。)请参阅 bugbase ticket 3547591。
在测试上述第 3 项(某些设备不接受输入)时,观察到了一件有趣的事情。输入几个字符后,如果用户将焦点切换到使用默认 StageText 的 TextInput,则至少一些丢失的字符将自动插入到新字段中。
这种方法将 StageText 的优点与 TextInputSkin (spark.skins.mobile) 的滚动功能相结合。总体思路是创建 1 个使用 StageText 的 TextInput 并将其分配到屏幕上的固定位置。默认情况下,此 TextInput 应隐藏。可以根据需要在舞台上创建和定位其他 TextInputs(使用 TextInputSkin)。当这些 TextInput 之一获得焦点时,应显示隐藏的代理 TextInput 并将焦点转移到它。将文本输入到代理项中时,更改处理程序应将文本复制到用户选择的 TextInput。当用户通过 Tab 或单击在其他地方设置焦点时,代理 TextInput 应再次隐藏。
如果需要,我可以提供一个代码示例。这种方法有几个缺点(上面提到过),但它们可能是我的实现的错误。
<renderMode> 和<fullscreen> 的值,此组件可能适合您。此方法涉及使用 StageWebView 在 AIR 应用程序内显示一个简单的 HTML 页面。 HTML 页面包含<input type="text"> 对象,这些对象使用Android 的本机文本和软件键盘。尽管在 HTML 页面和父 AIR 应用程序之间进行通信有点棘手,因为 StageWebView 不支持 Flash 到 JavaScript 的通信,就像 ExternalInterface 一样。
从 JavaScript(或 HTML)到 ActionScript 的通信很困难,因为 StageWebView 不允许 ActionScript 添加回调。 StageWebViewBridge 提供此功能已经有一段时间没有更新了,当我尝试它时,我无法使用 Flex 4.6 和 AIR 3.5 显示内容。
仍有一些方法可以使用LocationChangeEvent 向 ActionScript 传达信息。这背后的想法是让 AIR 应用程序监听位置变化事件,然后解析传入的 event.location 以获取信息。对于简单的链接,这很容易工作,但在涉及表单时事情变得更加复杂。在确定一种方法之前,我尝试了以下方法:
window.location.href 设置为包含 URL 编码的键/值对的字符串。由于 bugbase ticket 3362483 中所述的原因,此方法不起作用。<input type="text"> 标记并修改“提交”链接的 href 属性以包含 URL 编码的键/值对。单击此链接时,将调用 ActionScript LocationChangeEvent 处理程序,您可以使用 URLVariables 类解析传入数据。要与 JavaScript 通信(调用方法、传递参数),请使用 StageWebView's loadURL method,如下所示:
_stageWebView.loadURL( 'javascript:yourMethodName( "A string", true )' );
不幸的是,loadURL 方法的返回类型为 void(这意味着您无法通过这种方式检索数据)。
bugbase ticket 3535948 中描述了这种方法的最大缺点。如果您的 AIR 应用程序使用 <renderMode>direct</renderMode> 或 <fullscreen>true</fullscreen>,则通过 StageWebView 输入的文本将无法使用。 (响应会很迟缓。用户将无法选择或删除字符。)如果您的应用不需要这些标志中的任何一个,那么这条路线可能适合您。
全屏限制的一种解决方法是仅在您的应用程序需要使用 StageWebView 时禁用全屏模式。这可以使用 StageDisplayState 来完成,如下所示:
// Turn off fullscreen
stage.displayState = StageDisplayState.NORMAL;
// Turn on fullscreen
stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
剩下的最后一个选项(我知道)是编写一个本机扩展,它显示文本输入并将数据返回到您的 AIR 应用程序。这可能是本主题讨论的选项中最安全(尽管最令人失望)的选项。
【讨论】:
【讨论】: