有哪些选项可用于使用Adobe AIR处理Android上的文本输入?

时间:2013-04-05 18:01:13

标签: android mobile air adobe textinput

使用Adobe AIR处理Android上的文本输入有哪些选项?每个选项有哪些优点和缺点?

2 个答案:

答案 0 :(得分:12)

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

  • StageText 原生文字(默认)
  • TextInputSkin (spark.skins.mobile)
  • TextInputSkin (spark.skins.spark)
  • StageText + TextInputSkin (spark.skins.mobile)hybrid
  • StageWebView (如下所述)
  • 原生视图

我将讨论以下每种方法的一些优点和缺点。如果我错过了任何事情(或者如果您有其他想法我没有想过)请告诉我!


StageText的

默认情况下,在移动设备上运行的TextInputs使用StageText(本机文本)进行输入。 StageText提供了几个优点,因为Adobe概述了 in their online documentation ,包括自动更正,自定义软件键盘等。

bugbase ticket 3302441 中描述了使用StageText的最大缺点。当用户滚动时,StageText的定位会中断。文本字段显示在各自的TextInput之外,或者更糟糕的是,显示在其他TextInput之内。解决此缺陷的唯一方法是设计一个不允许滚动的UI。显然,这对手机和平板手机来说非常困难。


TextInputSkin(spark.skins.mobile)

此组件在内部使用 StyleableTextField 。它针对移动应用进行了优化。

当用户在某些Android版本上输入时,此组件会在TextInput中插入其他任意字符(例如,运行Android 2.3的Nook,运行Android 4.0的Kindle HD)。请参阅 bugbase ticket 3547601

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


TextInputSkin(spark.skins.spark)

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

此组件无法正确处理某些双字节字符(使用韩语等语言)。这些字符似乎插入到TextInput中(光标可见,但是没有文本呈现给用户)。 (可能可以使用嵌入字体解决此问题。)请参阅 bugbase ticket 3547591

在测试上述第3项(某些设备未接受输入)时,观察到一件有趣的事情。键入几个字符后,如果用户将焦点切换到使用默认StageText的TextInput,则至少部分缺少的字符将自动插入到新字段中。


StageText + TextInputSkin(spark.skins.mobile)hybrid

这种方法结合了StageText的优点和TextInputSkin(spark.skins.mobile)的滚动功能。一般的想法是创建1个TextInput使用StageText并将其分配到屏幕上的固定位置。默认情况下应隐藏此TextInput。可以在舞台上根据需要创建和定位其他TextInputs(使用TextInputSkin)。当其中一个TextInputs获得焦点时,应显示隐藏的代理TextInput,并应将焦点移至焦点。当文本输入到代理中时,更改处理程序应将文本复制到用户选择的TextInput。当用户选中或单击以将焦点设置在其他位置时,应再次隐藏代理项TextInput。

如果需要,我可以提供此代码示例。这种方法存在一些缺点(如上所述),但它可能是我实施的错误。


StageWebView

此方法涉及使用StageWebView在AIR应用程序内部显示简单的HTML页面。 HTML页面包含<input type="text">个对象,这些对象使用Android的原生文本和软件键盘。在HTML页面和父AIR应用程序之间进行通信虽然有点棘手,因为StageWebView不支持与 ExternalInterface 相同的Flash-to-JavaScript通信。

从JavaScript进行通信

从JavaScript(或HTML)到ActionScript的通信很困难,因为StageWebView不允许ActionScript添加回调。 StageWebViewBridge 提供此功能在一段时间内未更新,当我尝试使用时,我无法使用Flex 4.6和AIR 3.5显示内容。

仍有一些方法可以使用LocationChangeEvent向ActionScript传达信息。这背后的想法是AIR应用程序监听位置更改事件,然后解析传入的event.location以获取信息。对于简单的链接,这很容易,但是当涉及到表单时,事情变得更加复杂。在解决之前我尝试了以下方法:

从Flash进行通信

要与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应用程序的本机扩展。这可能是本主题中讨论的最安全(尽管最令人失望)选项。

答案 1 :(得分:1)

相关问题