bva*_*ghn 12
Android上用于处理文本输入的AIR开发人员可用的当前选项是:
我将讨论下面每种方法的一些优点和缺点.如果我错过了任何东西(或者你有其他想法我没想过),请告诉我!
默认情况下,在移动设备上运行的TextInputs使用StageText(本机文本)进行输入.StageText提供了一些优势,如Adobe 在其在线文档中所述,包括自动更正,软件键盘的自定义等.
使用StageText的最大缺点在bugbase ticket 3302441中有描述.当用户滚动时,StageText的定位会被破坏.文本字段显示在各自的TextInput之外,或者更糟糕的是,显示在其他TextInput之内.解决此缺陷的唯一方法是设计一个不允许滚动的UI.显然,这对手机和平板手机来说非常困难.
该组件在内部使用StyleableTextField.它针对移动使用进行了优化.
当用户在某些Android版本上输入时,此组件会在TextInput中插入其他任意字符(例如,运行Android 2.3的Nook,运行Android 4.0的Kindle HD).请参阅bugbase票证3547601.
如果您的应用程序仅本地化为英语(或基于拉丁语言),并且不需要支持较旧的Android版本,那么此组件可能适合您.
该组件在内部使用RichEditableText.它没有针对移动使用进行优化.除此之外,它还演示了一些不适合使用的缺陷(如上所列).
此组件无法正确处理某些双字节字符(使用韩语等语言).这些字符似乎插入到TextInput中(光标可见,但是没有文本呈现给用户).(可能使用嵌入字体可以解决此问题.)请参阅bugbase故障单3547591.
在测试上述第3项(某些设备未接受输入)时,观察到一件有趣的事情.键入几个字符后,如果用户将焦点切换到使用默认StageText的TextInput,则至少部分缺少的字符将自动插入到新字段中.
这种方法结合了StageText的优点和TextInputSkin(spark.skins.mobile)的滚动功能.一般的想法是创建1个TextInput使用StageText并将其分配到屏幕上的固定位置.默认情况下应隐藏此TextInput.可以在舞台上根据需要创建和定位其他TextInputs(使用TextInputSkin).当其中一个TextInputs获得焦点时,应显示隐藏的代理TextInput,并应将焦点移至焦点.当文本输入到代理中时,更改处理程序应将文本复制到用户选择的TextInput.当用户选中或单击以将焦点设置在其他位置时,应再次隐藏代理项TextInput.
如果需要,我可以提供此代码示例.这种方法存在一些缺点(如上所述),但它们可能是我实现的错误.
<renderMode>,<fullscreen>此组件可能适合您.此方法涉及使用StageWebView在AIR应用程序内部显示简单的HTML页面.HTML页面包含<input type="text">使用Android的本机文本和软件键盘的对象.在HTML页面和父AIR应用程序之间进行通信虽然有点棘手,因为StageWebView不支持与ExternalInterface相同的Flash到JavaScript通信.
从JavaScript(或HTML)到ActionScript的通信很困难,因为StageWebView不允许ActionScript添加回调.StageWebViewBridge提供此功能尚未在一段时间内更新,当我尝试使用时,我无法使用Flex 4.6和AIR 3.5显示内容.
仍然有使用LocationChangeEvent将信息传递给ActionScript的方法.这背后的想法是AIR应用程序侦听位置更改事件,然后解析传入event.location的信息.对于简单的链接,这很容易,但是当涉及到表单时,事情变得更加复杂.我在尝试以下方法之前尝试了以下方法:
window.location.href为包含URL编码的键/值对的字符串.此方法不适用于bugbase ticket 3362483中描述的原因.<input type="text">标记并修改href"提交"链接的属性以包含URL编码的键/值对.单击此链接时,将调用ActionScript LocationChangeEvent处理程序,您可以使用URLVariables类解析传入的数据.要与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应用程序.这可能是本主题中讨论的最安全(尽管最令人失望)的选项.