【问题标题】:What options are available for handling text input on Android using Adobe AIR?哪些选项可用于使用 Adob​​e AIR 在 Android 上处理文本输入?
【发布时间】:2013-04-05 18:01:13
【问题描述】:

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

【问题讨论】:

    标签: android mobile air adobe textinput


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2012-03-15
      • 2011-10-01
      相关资源
      最近更新 更多