4

哪些选项可用于使用 Adob​​e AIR 在 Android 上处理文本输入?每个选项的优点和缺点是什么?

4

2 回答 2

12

当前可供 Android 上的 AIR 开发人员处理文本输入的选项有:

  • StageText原生文本(默认)
  • TextInputSkin (spark.skins.mobile)
  • TextInputSkin (spark.skins.spark)
  • StageText + TextInputSkin (spark.skins.mobile) 混合
  • StageWebView(解释如下)
  • 本机视图

我将在下面讨论每种方法的一些优点和缺点。如果我遗漏了什么(或者如果您有其他我没有想到的想法),请告诉我!


舞台文字

  • 在所有情况下都正确处理输入?是的
  • 在所有情况下都正确显示?
    • 滚动时的垂直对齐问题。

默认情况下,在移动设备上运行的 TextInputs 使用 StageText(本机文本)进行输入。正如 Adob​​e在其在线文档中概述的那样,StageText 提供了几个优势,包括自动更正、软件键盘的自定义等。

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 票证 3547601

如果您的应用程序仅本地化为英语(或基于拉丁语的语言)并且不需要支持较旧的 Android 版本,那么此组件可能适合您。


TextInputSkin (spark.skins.spark)

  • 在所有情况下都正确处理输入?
    • 不接受某些双字节字符(例如韩语)。
    • 在某些设备上不接受任何输入(例如运行 Android 4.0 的三星 Galaxy 10.1)。
  • 在所有情况下都正确显示?是的

该组件在内部使用RichEditableText。它没有针对移动使用进行优化。除此之外,它还展示了一些使其不适合使用的缺陷(如上所列)。

此组件无法正确处理某些双字节字符(在韩语等语言中)。这些字符似乎被插入到 TextInput 中(光标在进步,可见),但没有向用户呈现文本。(有可能使用嵌入字体解决此问题。)请参阅bugbase 票证 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。当用户点击或点击以在其他地方设置焦点时,代理 TextInput 应该再次隐藏。

如果需要,我可以提供一个代码示例。这种方法有几个缺点(上面提到过),但它们可能是我的实现的错误。


StageWebView

  • 在所有情况下都正确处理输入?是/否
    • 根据 的值,<renderMode><fullscreen>组件可能会为您正常工作。
    • 开始工作有点棘手。
  • 在所有情况下都正确显示?是的

此方法涉及使用 StageWebView 在 AIR 应用程序内显示一个简单的 HTML 页面。HTML 页面包含<input type="text">使用 Android 的本机文本和软件键盘的对象。尽管在 HTML 页面和父 AIR 应用程序之间进行通信有点棘手,因为 StageWebView 不支持 Flash 到 JavaScript 的通信,就像ExternalInterface相同的 Flash 到 JavaScript 通信。

从 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 票证 3362483中描述的原因,此方法不起作用。
  • 将 onclick 处理程序添加到表单提交按钮,动态修改表单目标以包含 URL 编码的键/值对,然后提交表单。此方法不起作用,因为在调用 form.submit() 时未调度 LocationChangeEvents。
  • 将 onchange 处理程序添加到<input type="text">标签并修改href“提交”链接的属性以包含 URL 编码的键/值对。单击此链接时,将调用 ActionScript LocationChangeEvent 处理程序,您可以使用URLVariables类解析传入数据。

从 Flash 到 JavaScript 的通信

要与 JavaScript 通信(调用方法、传递参数),请使用StageWebView 的 loadURL 方法,如下所示:

_stageWebView.loadURL( 'javascript:yourMethodName( "A string", true )' );

不幸的是 loadURL 方法有一个 void 返回类型(这意味着你不能用这种方式检索数据)。

其他困难

这种方法的最大缺点在bugbase 票证 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 应用程序。这可能是该线程中讨论的最安全(尽管最令人失望)的选项。

于 2013-04-05T18:01:59.543 回答
1

我们可能有一个至少适用于我们的场景的解决方案:http: //blog.flexicious.com/post/Scrolling-Issues-With-TextInput-for-Flex-Air-Mobile-Native-StageText.aspx

于 2013-11-14T04:25:07.943 回答