Adobe Flex Mobile – TextArea拒绝在Android上滚动,StageWebView根本不会滚动

我正在尝试使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()。 两种解决方案都没有效

有人可以帮我解决这个问题吗? 我绝对难过。

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

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

所以你要么回到TextAreaSkin,因为你不再使用设备本机软键盘,或者找到一种绕滚动需要的方法。

我不知道StageWebView,但我怀疑它有同样的问题(本机组件放在displayList的顶部)。

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

这是我的工作,使您的StageText textinput按预期工作。

  1. 复制StyleableStageText的内容并创建一个新文件,如ExtendedStyleableStageText

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

    public function freezeStageText(){if(stageText){if(stageText.visible){createProxyImage(); } stageText.visible = false; stageText.stage = null; }}

    public function unFreezeStageText():void {if(stageText){if(!stageText.visible){disposeProxyImage(); } stageText.visible = true; stageText.stage = stage; }
    }

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

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

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

希望这可以帮助。