哪些选项可用于使用 Adob​​e AIR 在 Android 上处理文本输入?

Posted

技术标签:

【中文标题】哪些选项可用于使用 Adob​​e 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(本机文本)进行输入。正如 Adob​​e 所概述的那样,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 以获取信息。对于简单的链接,这很容易工作,但在涉及表单时事情变得更加复杂。在确定一种方法之前,我尝试了以下方法:

将 onclick 处理程序添加到表单提交按钮,将 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 应用程序。这可能是本主题讨论的选项中最安全(尽管最令人失望)的选项。

【讨论】:

很棒的帖子,我希望 Adob​​e 的某个人可以看看,即使是像编辑文本这样的基本功能也几乎不可能在 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

【讨论】:

以上是关于哪些选项可用于使用 Adob​​e AIR 在 Android 上处理文本输入?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在用于桌面 AIR 应用程序的 Adob​​e Flex 项目中使用诸如 turn.js 之类的 javascript 库吗?

多次启动 Adob​​e AIR 应用程序

选择大量文件时 Adob​​e Air 应用程序关闭

使用 Adob​​e AIR 下载文件

使用 Adob​​e AIR 构建插件架构

在 Adob​​e Flex/AIR 中使用 HTTPService 对象进行 HTTP 基本身份验证