自动调整大小的Flex移动版Spark文本框组件

8
我希望将我的移动端 Spark 文本框组件设置为自动换行。我发现了使用 mx_internal 的方法,但是我无法调用 mx_internal::getTextField().numLines 方法——它不存在......有没有人之前做过这个?

如果你找到了一种方法,但它不起作用,我想你必须分享一些代码,以便我们可以诊断为什么它不起作用。 - JeffryHouser
我尝试过将heightInLine={NaN}赋值-在之前的版本中可以工作,但在4.6中不行。另一种我尝试的方法是创建一个没有滚动条的新皮肤,但IDE给出了一个错误,说它在定义中找不到滚动条。所以我想问是否有其他建议? - Zaur Guliyev
这可能是因为4.6使用StageText而不是Flash TextField。如果您回到旧的皮肤,我敢打赌它会起作用。我没有时间查找特定的皮肤名称,但我认为我最近在Flextras博客上写过这个问题。 - JeffryHouser
2个回答

3

这是一个移动设备的解决方案:

for(var i:int=0; i < StyleableTextField(txt_genel.textDisplay).numLines; i++) {
        ta_height += StyleableTextField(txt_genel.textDisplay).getLineMetrics(i).height;
}
txt_genel.height = ta_height;

0
这里有一个带有自定义 TextArea 类的解决方案,有注释可以更好地解释。
package
{   
    import mx.events.FlexEvent;

import spark.components.TextArea;
import spark.components.supportClasses.StyleableStageText;
import spark.events.TextOperationEvent;

public class CustomTextArea extends TextArea
{

    private var _lineNumber:int = 1;
    private var _padding:int;
    private var _minHeight:int;

    public function CustomTextArea()
    {
        super();

        addEventListener(FlexEvent.CREATION_COMPLETE, function setBehaviour(event:FlexEvent):void
        {
            //minHeight to prevent textarea to be too small
            _minHeight = height;
            //padding between textarea and text component inside to calculate line number
            _padding = ((textDisplay as StyleableStageText).x - x) + (width - (textDisplay as StyleableStageText).width);
            //listener for text changing
            addEventListener(TextOperationEvent.CHANGE, setHeight);
        });
    }

    private function setHeight(event:TextOperationEvent):void
    {
        //line number is textwidth divided by component width
        _lineNumber = (((textDisplay as StyleableStageText).measureText(text).width + _lineNumber * _padding) / width) + 1;
        //text height is line number * text height
        var newHeight:int = _lineNumber * (textDisplay as StyleableStageText).measureText(text).height;
        //if new height > min height, set height
        if (newHeight > _minHeight)
            height = newHeight;
    }
}
}

希望这可以帮到你。
编辑:当有大量文本行时,TextArea 的高度会上升得太多。应该加以控制。

它在第 _padding = ((textDisplay as StyleableStageText).x - x) + (width - (textDisplay as StyleableStageText).width); 行抛出异常,异常为:“无法访问空对象引用的属性或方法。” - Zaur Guliyev
以下是我在mxml中使用它的方法: <component:CustomTextArea id="txt_genel" width="100%" skinClass="spark.skins.mobile.TextAreaSkin" textAlign="left" fontFamily="_typewriter" contentBackgroundAlpha="0" borderVisible="false" editable="false" /> - Zaur Guliyev
还有一个动作脚本,我在其中为它分配了一个文本:StyleableTextField(txt_genel.textDisplay).htmlText = ozet['genelbilgiler'] as String; - Zaur Guliyev
我找到了一个简单的解决方案。无论如何,还是谢谢! - Zaur Guliyev
1
好的,很高兴为你感到高兴!很抱歉没有早些看到你的评论,但如果你已经找到了解决方案,那就太完美了 :) 你的异常可能是由于你使用我的组件的方式不同,因为我只测试了最少的属性。 - jpicard
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接