android - 哪些选项可用于使用Adobe AIR在Android上处理文本输入?

标签 android mobile air adobe textinput

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

最佳答案

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


StageText本机文本(默认)
TextInputSkin(spark.skins.mobile)
TextInputSkin(spark.skins.spark)
StageText + TextInputSkin(spark.skins.mobile)混合
StageWebView(下面说明)
本机视图


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



StageText


在所有情况下都能正确处理输入?
在所有情况下都能正确显示?


滚动时出现垂直对齐问题。



默认情况下,在移动设备上运行的TextInputs使用StageText(本机文本)进行输入。 StageText具有Adobe概述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的Samsung Galaxy 10.1)上不接受任何输入。

在所有情况下都能正确显示?


该组件在内部使用RichEditableText。尚未针对移动应用进行优化。除此之外,它还显示出一些缺陷(上面列出),这些缺陷使其不适合使用。

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

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



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


在所有情况下都能正确处理输入?
在所有情况下都能正确显示?


有时,软件键盘的“显示”动画会连续触发两次,从而产生不良的视觉效果。
有时,焦点处理很困难,并且可能导致StageText-TextInput在没有软件键盘的情况下显示,直到学习者再次触摸它为止。



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

如果需要,我可以提供一个代码示例。这种方法(上面提到)有两个缺点,但有可能是我实现的错误。



StageWebView


在所有情况下都能正确处理输入?
是/否


根据<renderMode><fullscreen>的值,此组件可能会为您正常工作。
开始工作有点棘手。

在所有情况下都能正确显示?


此方法涉及使用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以获取信息。对于简单的链接,这很容易工作,但在表单方面则变得更加复杂。在解决一个问题之前,我尝试了以下方法:


将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方法的返回类型为空(这意味着您无法以这种方式检索数据)。

其他困难

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应用程序。这可能是该线程中讨论的最安全(尽管最令人失望)的选择。

关于android - 哪些选项可用于使用Adobe AIR在Android上处理文本输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15840504/

相关文章:

javascript - 有没有办法选择没有输入[类型]的手机键盘?

ios - Flash Air iOS 开发 : Is it possible to launch a browser from within your applications?

java - 如何从存储在 ArrayList 中的多级 HashMap 中获取值?

java - 在从 Java ProcessBuilder 运行的 shell 中显示提示

android - 如何在服务器上存储本地 SQLite 数据库

android - 在 React Native 中使用 python 库

java - 在使用 junit 进行测试期间,Android 处理程序为空

android - kotlin 中文件和类的区别

apache-flex - AIR/ ActionScript 3.0 : error logging

ubuntu - 在 ubuntu 上安装 adobe air 后找不到 adl