哪些选项可用于使用 Adobe AIR 在 Android 上处理文本输入?
Posted
技术标签:
【中文标题】哪些选项可用于使用 Adobe AIR 在 Android 上处理文本输入?【英文标题】:What options are available for handling text input on Android using Adobe AIR? 【发布时间】:2013-04-05 18:01:13 【问题描述】:有每个选项的优缺点是什么?
【问题讨论】:
【参考方案1】:android 上的 AIR 开发人员可用于处理文本输入的当前选项有:
StageText 原生文本(默认) TextInputSkin (spark.skins.mobile) TextInputSkin (spark.skins.spark) StageText + TextInputSkin (spark.skins.mobile) 混合 StageWebView(如下所述) 本机视图我将在下面讨论每种方法的一些优点和缺点。如果我遗漏了什么(或者如果您有其他我没有想到的想法),请告诉我!
舞台文字
在所有情况下都能正确处理输入? 是的 在所有情况下都能正常显示吗? 否 滚动时出现垂直对齐问题。默认情况下,在移动设备上运行的 TextInputs 使用 StageText(本机文本)进行输入。正如 Adobe 所概述的那样,StageText 提供了几个优点 in their online documentation,包括自动更正、软件键盘的自定义等。
bugbase ticket 3302441 中描述了使用 StageText 的最大缺点。当用户滚动时,StageText 的定位会被破坏。文本字段出现在它们各自的 TextInputs 之外,或者更糟糕的是,出现在其他 TextInputs 之内。此缺陷的唯一解决方法是设计一个不允许滚动的 UI。显然,这对于手机和平板手机来说是非常困难的。
TextInputSkin (spark.skins.mobile)
在所有情况下都能正确处理输入? 是的 在所有情况下都能正常显示吗? 没有 在某些 Android 版本(例如运行 Android 2.3 的 Nook)上插入随机字符。此组件在内部使用 StyleableTextField。它针对移动使用进行了优化。
当用户在某些 Android 版本(例如运行 Android 2.3 的 Nook、运行 Android 4.0 的 Kindle HD)上键入时,此组件会在 TextInput 中插入额外的任意字符。请参阅 bugbase ticket 3547601。
如果您的应用程序仅本地化为英语(或基于拉丁语的语言)并且不需要支持较旧的 Android 版本,那么此组件可能适合您。
TextInputSkin (spark.skins.spark)
在所有情况下都能正确处理输入? 否 不接受某些双字节字符(例如韩语)。 在某些设备(例如运行 Android 4.0 的三星 Galaxy 10.1)上不接受任何输入。 在所有情况下都能正常显示吗? 是的此组件在内部使用 RichEditableText。它没有针对移动使用进行优化。除此之外,它还展示了一些使其不适合使用的缺陷(如上所列)。
此组件无法正确处理某些双字节字符(在韩语等语言中)。这些字符似乎被插入到 TextInput 中(光标在进步,可见),但没有向用户呈现文本。 (使用嵌入字体可能会解决此问题。)请参阅 bugbase ticket 3547591。
在测试上述第 3 项(某些设备不接受输入)时,观察到了一件有趣的事情。输入几个字符后,如果用户将焦点切换到使用默认 StageText 的 TextInput,则至少一些丢失的字符将自动插入到新字段中。
StageText + TextInputSkin (spark.skins.mobile) 混合
在所有情况下都能正确处理输入? 是的 在所有情况下都能正常显示吗? 没有 有时软件键盘的“显示”动画会连续触发两次,从而产生不良的视觉效果。 有时焦点处理很困难,可能会导致 StageText-TextInput 在没有软件键盘的情况下显示,直到学习者再次触摸它。这种方法将 StageText 的优点与 TextInputSkin (spark.skins.mobile) 的滚动功能相结合。总体思路是创建 1 个使用 StageText 的 TextInput 并将其分配到屏幕上的固定位置。默认情况下,此 TextInput 应隐藏。可以根据需要在舞台上创建和定位其他 TextInputs(使用 TextInputSkin)。当这些 TextInput 之一获得焦点时,应显示隐藏的代理 TextInput 并将焦点转移到它。将文本输入到代理项中时,更改处理程序应将文本复制到用户选择的 TextInput。当用户通过 Tab 或单击在其他地方设置焦点时,代理 TextInput 应再次隐藏。
如果需要,我可以提供一个代码示例。这种方法有几个缺点(上面提到过),但它们可能是我的实现的错误。
StageWebView
在所有情况下都能正确处理输入? 是/否 根据<renderMode>
和<fullscreen>
的值,此组件可能适合您。
开始工作有点棘手。
在所有情况下都能正常显示吗? 是的
此方法涉及使用 StageWebView 在 AIR 应用程序内显示一个简单的 html 页面。 HTML 页面包含<input type="text">
对象,这些对象使用Android 的本机文本和软件键盘。尽管在 HTML 页面和父 AIR 应用程序之间进行通信有点棘手,因为 StageWebView 不支持 Flash 到 javascript 的通信,就像 ExternalInterface 一样。
从 JavaScript 到 Flash 的通信
从 JavaScript(或 HTML)到 ActionScript 的通信很困难,因为 StageWebView 不允许 ActionScript 添加回调。 StageWebViewBridge 提供此功能已经有一段时间没有更新了,当我尝试它时,我无法使用 Flex 4.6 和 AIR 3.5 显示内容。
仍有一些方法可以使用LocationChangeEvent 向 ActionScript 传达信息。这背后的想法是让 AIR 应用程序监听位置变化事件,然后解析传入的 event.location
以获取信息。对于简单的链接,这很容易工作,但在涉及表单时事情变得更加复杂。在确定一种方法之前,我尝试了以下方法:
window.location.href
设置为包含 URL 编码的键/值对的字符串。由于 bugbase ticket 3362483 中所述的原因,此方法不起作用。
将 onclick 处理程序添加到表单提交按钮,动态修改表单目标以包含 URL 编码的键/值对,然后提交表单。这种方法不起作用,因为在调用 form.submit() 时没有调度 LocationChangeEvents。
将 onchange 处理程序添加到 <input type="text">
标记并修改“提交”链接的 href
属性以包含 URL 编码的键/值对。单击此链接时,将调用 ActionScript LocationChangeEvent 处理程序,您可以使用 URLVariables 类解析传入数据。
从 Flash 到 JavaScript 的通信
要与 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 应用程序。这可能是本主题讨论的选项中最安全(尽管最令人失望)的选项。
【讨论】:
很棒的帖子,我希望 Adobe 的某个人可以看看,即使是像编辑文本这样的基本功能也几乎不可能在 AIR 中正确实现。你的意思是你可以分享混合解决方案的示例代码,那太棒了。 谢谢伙计。不幸的是,接下来的 3 周我不在办公室,所以我无法访问我引用的示例代码。如果我回来时记得这个线程 - 我会用一些代码向你发送一条消息。 :) 在 ios7 上使用 TextInputSkin (spark.skins.mobile) 似乎更有问题,因为您输入它会选择您输入的内容,因此如果不删除那里的内容,您将无法有效地输入任何内容 有谁知道这些在 Flash Professional 中哪些工作/不会工作?我正在开发一个混合桌面/网络/安卓应用程序。【参考方案2】:我们可能有一个至少适用于我们的场景的解决方案:http://blog.flexicious.com/post/Scrolling-Issues-With-TextInput-for-Flex-Air-Mobile-Native-StageText.aspx
【讨论】:
以上是关于哪些选项可用于使用 Adobe AIR 在 Android 上处理文本输入?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在用于桌面 AIR 应用程序的 Adobe Flex 项目中使用诸如 turn.js 之类的 javascript 库吗?