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

bva*_*ghn 4 air mobile adobe android textinput

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

bva*_*ghn 12

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

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

我将讨论下面每种方法的一些优点和缺点.如果我错过了任何东西(或者你有其他想法我没想过),请告诉我!


StageText的

默认情况下,在移动设备上运行的TextInputs使用StageText(本机文本)进行输入.StageText提供了一些优势,如Adobe 在其在线文档中所述,包括自动更正,软件键盘的自定义等.

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


TextInputSkin(spark.skins.mobile)

该组件内部使用StyleableTextField.它针对移动使用进行了优化.

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

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


TextInputSkin(spark.skins.spark)

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

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

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


StageText + TextInputSkin(spark.skins.mobile)混合

这种方法结合了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到JavaScript通信.

从JavaScript到Flash的通信

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

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

从Flash到JavaScript的通信

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

_stageWebView.loadURL( 'javascript:yourMethodName( "A string", true )' );
Run Code Online (Sandbox Code Playgroud)

不幸的是,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;
Run Code Online (Sandbox Code Playgroud)

原生视图

剩下的最后一个选项(我知道)是编写一个本机扩展,显示文本输入并将数据返回给AIR应用程序.这可能是本主题中讨论的最安全(尽管最令人失望)的选项.

  • 很棒的帖子,我希望Adobe的某个人能够看一看,即使是编辑文本等基本功能也几乎无法在AIR中正确实现.您的意思是您可以共享混合解决方案的示例代码,这将是非常棒的. (2认同)