Android 上的 AIR 开发人员当前可用于处理文本输入的选项有:
-
舞台文本原生文本(默认)
-
文本输入皮肤(spark.skins.mobile)
-
文本输入皮肤(火花.皮肤.火花)
-
舞台文本 + 文本输入皮肤(spark.skins.mobile) 混合动力
-
舞台网页视图(下面解释)
- 原生视图
我将在下面讨论每种方法的一些优点和缺点。如果我错过了任何内容(或者如果您有其他我没有考虑过的想法)请告诉我!
舞台文本
- Handles input properly in all cases? Yes
- Displays properly in all cases? No
默认情况下,在移动设备上运行的 TextInput 使用 StageText(本机文本)进行输入。正如 Adobe 概述的那样,StageText 具有多项优势在他们的在线文档中,包括自动更正、软件键盘的定制等。
使用 StageText 的最大缺点如下所述错误库票 3302441。当用户滚动时,StageText 的定位会被破坏。文本字段出现在各自的 TextInput 之外,或者更糟糕的是,出现在其他 TextInput 的内部。解决此缺陷的唯一方法是设计一个不允许滚动的 UI。显然,这对于手机和平板手机来说非常困难。
文本输入皮肤(spark.skins.mobile)
- Handles input properly in all cases? Yes
- Displays properly in all cases? No
- 在某些 Android 版本上插入随机字符(例如运行 Android 2.3 的 Nook)。
该组件使用可样式文本字段内部。它针对移动使用进行了优化。
当用户在某些 Android 版本上键入时(例如运行 Android 2.3 的 Nook、运行 Android 4.0 的 Kindle HD),此组件会在 TextInput 中插入额外的任意字符。看错误库票 3547601.
如果您的应用程序仅本地化为英语(或基于拉丁语的语言)并且不需要支持较旧的 Android 版本,那么此组件可能很适合您。
文本输入皮肤(火花.皮肤.火花)
- Handles input properly in all cases? No
- 不接受某些双字节字符(例如韩语)。
- 在某些设备上不接受任何输入(例如运行 Android 4.0 的 Samsung Galaxy 10.1)。
- Displays properly in all cases? Yes
该组件使用丰富的可编辑文本内部。它没有针对移动使用进行优化。除此之外,它还表现出一些使其不适合使用的缺陷(上面列出)。
该组件无法正确处理某些双字节字符(韩语等语言)。这些字符似乎被插入到 TextInput 中(光标明显前进),但没有向用户呈现任何文本。 (使用嵌入字体可能可以解决此问题。)请参阅错误库票 3547591.
在测试上述第三项(某些设备上不接受输入)时,观察到一件有趣的事情。输入几个字符后,如果用户将焦点切换到使用默认 StageText 的 TextInput,则至少一些缺失的字符将自动插入到新字段中。
舞台文字+文本输入皮肤(spark.skins.mobile) 混合动力
- Handles input properly in all cases? Yes
- Displays properly in all cases? No
- 有时,软件键盘的“显示”动画会连续触发两次,从而产生不良的视觉效果。
- 有时焦点处理很困难,可能会导致在学习者再次触摸之前没有软件键盘的情况下显示 StageText-TextInput。
这种方法结合了 StageText 的优点和 TextInputSkin (spark.skins.mobile) 的滚动功能。总体思路是创建 1 个使用 StageText 的 TextInput 并将其分配到屏幕上的固定位置。默认情况下,此 TextInput 应隐藏。可以根据需要在舞台上创建和定位其他 TextInput(使用 TextInputSkin)。当这些 TextInput 之一获得焦点时,应显示隐藏的代理 TextInput 并将焦点转移到它。当文本输入代理项时,更改处理程序应将文本复制到用户选择的 TextInput。当用户通过选项卡或单击将焦点设置在其他位置时,代理 TextInput 应再次隐藏。
如果需要,我可以提供一个代码示例。这种方法有一些缺点(如上所述),但它们可能是我的实现的错误。
舞台网页视图
- Handles input properly in all cases?
Yes/No
- 取决于值
<renderMode>
and <fullscreen>
该组件可能适合您。
- 开始工作有点棘手。
- Displays properly in all cases? Yes
此方法涉及使用 StageWebView 在 AIR 应用程序内显示简单的 HTML 页面。 HTML 页面包含<input type="text">
使用 Android 的本机文本和软件键盘的对象。 HTML 页面和父 AIR 应用程序之间的通信有点棘手,因为 StageWebView 不支持 Flash 到 JavaScript 的通信,就像外部接口.
从 JavaScript 到 Flash 进行通信
从 JavaScript(或 HTML)到 ActionScript 进行通信很困难,因为 StageWebView 不允许 ActionScript 添加回调。舞台网络视图桥提供此功能已经有一段时间没有更新了,当我尝试它时,我无法使用 Flex 4.6 和 AIR 3.5 显示内容。
仍然有一些方法可以使用以下方式向 ActionScript 传递信息位置改变事件。这背后的想法是让 AIR 应用程序侦听位置更改事件,然后解析传入的事件event.location
供参考。对于简单的链接,这很容易工作,但当涉及到表单时,事情会变得更加复杂。在选择一种方法之前,我尝试了以下方法:
-
Add an onclick handler to the form-submit button that sets
window.location.href
to a string containing URL-encoded key/value pairs. This approach does not work for reasons described in bugbase ticket 3362483.
-
Add an onclick handler to the form-submit button that dynamically modifies the form-target to contain URL-encoded key/value pairs and then submits the form. This approach does not work because LocationChangeEvents are not dispatched when form.submit() is called.
-
Add onchange handlers to
<input type="text">
tags and modify the href
attribute of a "submit" link to contain URL-encoded key/value pairs. When this link is clicked, your ActionScript LocationChangeEvent handler will be invoked and you can parse the incoming data using the URLVariables class.
从 Flash 到 JavaScript 进行通信
要与 JavaScript 通信(调用方法、传递参数),请使用StageWebView的loadURL方法像这样:
_stageWebView.loadURL( 'javascript:yourMethodName( "A string", true )' );
不幸的是,loadURL 方法有一个 void 返回类型(这意味着您无法通过这种方式检索数据)。
其他困难
这种方法的最大缺点描述于错误库票 3535948。如果您的 AIR 应用程序使用<renderMode>direct</renderMode>
or <fullscreen>true</fullscreen>
那么通过 StageWebView 输入的文本将无法使用。 (响应将会缓慢。用户将无法选择或删除字符。)如果您的应用程序不需要这些标志中的任何一个,那么此路线可能适合您。
全屏限制的一种解决方法是仅当您的应用程序需要使用 StageWebView 时才禁用全屏模式。这可以通过以下方式完成舞台显示状态像这样:
// Turn off fullscreen
stage.displayState = StageDisplayState.NORMAL;
// Turn on fullscreen
stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
原生视图
- Handles input properly in all cases? Yes
- Displays properly in all cases? Yes
最后剩下的选项(据我所知)是编写一个本机扩展,用于显示文本输入并将数据返回到 AIR 应用程序。这可能是本线程中讨论的最安全(尽管最令人失望)的选项。