【问题标题】:Adobe Flex Mobile - TextArea refuses to scroll on Android, StageWebView won't scroll at allAdobe Flex Mobile - TextArea 拒绝在 Android 上滚动,StageWebView 根本不会滚动
【发布时间】:2012-07-05 19:01:16
【问题描述】:

我正在尝试让 Spark TextArea 组件在添加文本时自动向下滚动。

第一次填充 TextArea 时,垂直滚动条位于底部。但是,如果我附加更多文本,它就会完全拒绝滚动。它可以在 iOS 平台上运行,但不能在 Android 平台上运行!!

根据此处找到的示例,我尝试执行以下操作:http://devgirl.org/2010/12/16/automatically-scroll-flex-mobile-textarea/

StyleableTextField(TextArea1.textDisplay).htmlText += textHTML;
StyleableTextField(TextArea1.textDisplay).scrollV++;

我也试过以下两行代码:

StyleableTextField(TextArea1.textDisplay).verticalScrollPosition = int.MAX_VALUE - 1;
TextArea1.scrollToRange(int.MAX_VALUE, int.MAX_VALUE);

没有任何效果!每当更新 TextArea 时,它只会向上滚动到顶部,或者根本不移动。

我什至尝试更改程序,以便将 HTML 内容显示在 StageWebView 中。但我根本无法让那个滚动,即使在 iPad 上也是如此。我尝试调用 JavaScript 函数 (document.getElementById('id').focus()) 以及在代码中插入隐藏的锚标记,并在其上调用 loadURL()。两种解决方案都不起作用。

有人可以帮我解决这个问题吗?我完全被难住了。

【问题讨论】:

    标签: android ios apache-flex mobile adobe


    【解决方案1】:

    如果TextArea 和TextInput 使用它们的StageText 皮肤,则它们不支持滚动。您需要将 TextArea 设置为使用“TextAreaSkin”进行滚动才能正常工作。
    TextArea 和 TextInput 在使用 StageText 皮肤时甚至不支持软键盘的滚动/平移。

    这样做的原因是当 TextArea 使用 StageText 皮肤时,AIR 实际上使用的是操作系统原生文本框并将其放置在您的 displayList 之上。这就是为什么使用 StageText 外观的文本框将始终显示在所有其他显示对象之上的原因。
    这可能很好,因为我们可以在我们的应用程序中拥有本机显示对象,让我们可以访问操作系统必须提供的所有服务(自动更正、android 软键盘上的“下一步”/“完成”按钮等),但是有很多情况下你不能使用它们。

    因此,您要么必须返回到 TextAreaSkin,因为您不再获得设备本机软键盘,所以它很臭,或者找到一种方法来解决您的滚动需求。

    我不了解 StageWebView,但我怀疑它也有同样的问题(原生组件位于 displayList 之上)。

    【讨论】:

    • 感谢您的回复。基本上,这个应用程序每隔几秒就会从网络服务下载消息,并且其中有一些 HTML 格式。如果 TextArea 不起作用,显示它们的最佳方式是什么?
    • 同样的体验 - 使用 FB 4.6 和 4.7 beta 2。仅使用 flash.text.TextField 怎么样,是否可以用于移动应用程序?
    【解决方案2】:

    您可以使用默认文本字段,但请注意,当文本输入聚焦时,您必须处理诸如自动滚动到该文本字段之类的所有内容(因此,如果您将文本输入放置得太靠近键盘区域,它将被键盘覆盖) , SoftKeyboardType 可能无法正确显示(如数字键盘)... 从我的角度来看,舞台文本是文本输入的最佳选择。

    这是我的工作,以使您的 StageText 文本输入按预期工作。

    1. 复制StyleableStageText的内容,新建一个类似ExtendedStyleableStageText的文件

    2. 在 ExtendedStyleableStageText 中添加 2 个函数:

      公共函数 freezeStageText(){ 如果(舞台文本){ 如果(舞台文本。可见){ 创建代理图像(); } stageText.visible = false; stageText.stage = null; } }

      公共函数 unFreezeStageText():void{ 如果(舞台文本){ 如果(!stageText.visible){ disposeProxyImage(); } stageText.visible = true; stageText.stage = 舞台; }
      }

    3. 将 spark.skins.mobile.supportClasses.StageTextSkinBase 的内容复制到新文件,如 ExtendedStageTextSkinBase。

    4. 在您的 ExtendedStageTextSkinBase 中将 textDisplay 更改为 ExtendedStyleableStageText
    5. 复制 spark.skins.mobile.StageTextInputSkin 的内容并创建您自己的文本输入皮肤文件。 在你的皮肤中,皮肤类应该扩展你新创建的 ExtendedStageTextSkinBase 文件并添加函数

          protected function commitCurrentState():void{
            super.commitCurrentState();
            if(currentState == 'disabled'){
               textDisplay.freezeStageText();
            }else{
               textDisplay.unFreezeStageText();
            }
          }
      
    6. 在您需要使用文本输入的任何视图中,如果您需要在视图顶部显示弹出窗口,请确保将所有启用的文本输入更改为 false,或者如果您需要定位文本正确滚动时,您可以将 TouchInteractionStart 和 TouchInteractionEnd 添加到滚动条,然后监听事件,当用户开始触摸并滚动滚动条时,禁用视图中可见的所有文本输入,当用户停止触摸时,重新启用所有文本输入。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。但最终,我们更改了应用程序,使其不再使用 TextArea 控件。
    猜你喜欢
    • 2011-11-08
    • 2012-03-09
    • 2013-08-06
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多