Flex 4.6 Mobile - TextArea& TextInput皮肤问题

时间:2012-11-16 16:20:46

标签: actionscript-3 flex textarea flex4.6

这适用于AIR 3.1上的Flex 4.6。我在AIR 3.5中也遇到了同样的问题。

在我正在处理的应用程序中,我遇到了textInputs和textareas中的文本问题,这些文本在视图之间停留在屏幕上,同时滚动等等。

我看到的修复建议是为textinput和textarea使用不同的skinclass:

skinClass="spark.skins.spark.TextAreaSkin"

Adobe Flex Mobile - TextArea refuses to scroll on Android, StageWebView won't scroll at all是使用TextAreaSkin的其中一个建议的示例。

但是,当使用它和等效的TextInputSkins时,我现在遇到了一些非常重要的问题。

在iPad 2(iOS6)上我们使用的软键盘根本不会出现,在我们的三星Galaxy平板电脑(Android 4)上,键盘只允许输入数字和某些特殊字符(如果在我按住一个特定的字母,但不是正常打字时)。

我在这里发现了另一个与我类似的问题: http://forums.adobe.com/message/4078890但它没有解决方案。

奇怪的是,我的Android(Desire)手机上的一切正常,或者如果我在三星Galaxy平板电脑上使用不同的键盘应用程序(Swiftkey),那么它也能正常工作。

我已经在我们的其他应用中对此进行了测试,并且在那个应用中遇到了同样的问题。 (我必须使用该应用程序的皮肤的唯一实例是不可编辑的textareas - 我从未看到我在该应用程序中提到的第一个问题。)

编辑:我已经创建了一个相当基本的演示,其中包含一些观点,我已经复制了我遇到的大部分问题。它是一个使用splitview导航器的移动应用程序。 主要申请文件:              

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<!-- Split View Navigator used for Tablet for panelled functionality -->
<s:SplitViewNavigator width="100%" height="100%">
    <s:layout.landscape>
        <s:HorizontalLayout />
    </s:layout.landscape>
    <s:layout.portrait>
        <s:VerticalLayout />
    </s:layout.portrait>
    <s:ViewNavigator width.landscape="35%" height.landscape="100%"
                     width.portrait="100%" height.portrait="30%" 
                     firstView="views.TestView" />
    <s:ViewNavigator width="100%" height="100%" height.portrait="100%"
                     firstView="views.TestFormHomeView" />
</s:SplitViewNavigator>
</s:Application>

主页视图:          

<fx:Script>
    <![CDATA[
        protected function buttonClick():void
        {
            navigator.pushView(TestView2);
        }

        protected function listClick():void
        {
            navigator.popView();
            navigator.pushView(TestFormHomeView);
        }
    ]]>
</fx:Script>

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Scroller width="100%" height="100%">
    <s:HGroup width="100%">
        <s:List width="50%" click="listClick()">
            <s:ArrayCollection>
                <fx:String>Test1</fx:String>
                <fx:String>Test2</fx:String>
                <fx:String>Test3</fx:String>
                <fx:String>Test4</fx:String>
                <fx:String>Test5</fx:String>
            </s:ArrayCollection>
        </s:List>
        <s:VGroup width="50%">
            <s:TextArea id="testing" skinClass="spark.skins.spark.TextAreaSkin" />
            <s:TextArea id="testing2" />
            <s:Button click="buttonClick()" label="Next Screen" />
        </s:VGroup>
    </s:HGroup>
</s:Scroller>
</s:View>

TestView:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" title="TestView">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<s:TextArea id="testing2" />
</s:View>

TestView2:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" title="TestView2">
<fx:Script>
    <![CDATA[
        protected function goBack():void
        {
            navigator.popView();                
        }
    ]]>
</fx:Script>
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:layout>
    <s:VerticalLayout />
</s:layout>
<s:TextArea id="testing2" />
<s:Button label="Back" click="goBack()" />
</s:View>

HomeView上的主要文本区域应用了skinclass,对我来说有以下问题:

iOS(iPad2):根本没有softKeyboard。

Android(三星Galaxy Tab):键盘出现但只允许数字和某些特殊字符

我无法重现问题(没有其他皮肤类),文字停留在屏幕上,但在Android上,如果您在“TestView”的文本框中键入内容并单击“下一屏幕”,TestView中的文本将会视图加载后消失(直到您单击文本框)。如果你有一个足够长的屏幕滚动文本框会导致很多问题,如果你不使用其他皮肤类。

3 个答案:

答案 0 :(得分:2)

好的,我发现了我的问题。最终变成了一个非常简单的。

我使用的是错误的皮肤。有一个特定的移动皮肤叫做:

spark.skins.mobile.TextInputSkin

它还没有完美地工作,但我实际上有一些工作的事实是一种解脱大声笑。

答案 1 :(得分:1)

当我们需要在移动设备中为TextInput和TextArea设置外观时,我们需要子类化默认的spark.skins.mobile.MobileSkin(或MobileTextInputSkin),因为使用Actionscript的Mobile skin与默认的MXML外观相比是轻量级的外观。如果你使用MXML为TextInput和TextArea设置外观,在三星的手机和平板电脑(不使用默认的谷歌Android键盘)等设备上,你会遇到输入聚焦时SoftKeyboard不会出现的问题。

另一件事是:我们永远不应该在TextInput和TextArea上使用 restrict 属性,否则,我们将得到文本保持相互覆盖的错误。 希望这个帮助,Rjs37

答案 2 :(得分:0)

我为StageTextAreaSkin和StageTextInputSkin创建了一个解决方法,可以在Scroller中使用这些皮肤。如果您想要使用TextInputSkin的唯一原因是支持滚动,这应该有所帮助。它可以在GitHub上找到:

https://github.com/lizardon/TouchScrollStageText

它的工作原理是对StyleableStageText类进行更改,以侦听触摸事件和位置更改到祖先Scroller组件。

希望Apache能尽快解决这个问题,并且不需要解决方法。