Отображение html-содержимого внутри меток Flex не так просто, как в Flex 3, просто установив
свойство htmlText . Вот 3 элемента управления Spark, используемых для отображения текста:
- Метка — только легкий текст
- RichText — как следует из названия, он поддерживает расширенный текст.
Также позволяет импортировать HTML-контент (теги привязки <a> не работают) - RichEditableText — обеспечивает ту же поддержку форматированного текста, что и элемент управления RichText.
Позволяет редактировать и привязывать HTML-теги работать должным образом
Вот список
поддерживаемых тегов HTML :
<div>, <p>, <a>, <span>, <img>, <br> .
Как отмечалось выше, если вы хотите использовать якорные
теги <a> , вы должны использовать элемент
управления RichEditableText . В этом случае вы, скорее всего, захотите также установить
свойство editable = «false» .
Свойство anchor
href может быть установлено на относительный путь, например
<a href="index.html">index</a>
Или абсолютный как
<a href="http://google.com" target="_blank">google</a>
Обратите внимание, что вы можете установить
целевое свойство, чтобы контролировать, открывается ли ссылка в новом окне или нет.
Если вы хотите слушать, когда пользователь нажимает на якорь, это возможно, но требует гораздо больше работы. По сути, вы импортируете строку html в
объект TextFlow . Затем вы перебираете все дочерние элементы, пока не найдете
LinkElement (который представляет тег привязки), а затем добавляете
прослушиватель событий FlowElementMouseEvent.CLICK .
Вот пример кода, который я использую для достижения этой цели
:
/** * Converts the html string (from the resources) into a TextFlow object * using the TextConverter class. Then it iterates through all the * elements in the TextFlow until it finds a LinkElement, and adds a * FlowElementMouseEvent.CLICK event handler to that Link Element. */ public static function addLinkClickHandler(html:String, linkClickedHandler:Function):TextFlow { var textFlow:TextFlow = TextConverter.importToFlow(html, TextConverter.TEXT_FIELD_HTML_FORMAT); var link:LinkElement = findLinkElement(textFlow); if (link != null) { link.addEventListener(FlowElementMouseEvent.CLICK, linkClickedHandler, false, 0, true); } else { trace("Warning - couldn't find link tag in: " + html); } return textFlow; } /** * Finds the first LinkElement recursively and returns it. */ private static function findLinkElement(group:FlowGroupElement):LinkElement { var childGroups:Array = []; // First check all the child elements of the current group, // Also save any children that are FlowGroupElement for (var i:int = 0; i < group.numChildren; i++) { var element:FlowElement = group.getChildAt(i); if (element is LinkElement) { return (element as LinkElement); } else if (element is FlowGroupElement) { childGroups.push(element); } } // Recursively check the child FlowGroupElements now for (i = 0; i < childGroups.length; i++) { var childGroup:FlowGroupElement = childGroups[i]; var link:LinkElement = findLinkElement(childGroup); if (link != null) { return link; } } return null; }
Простой элемент управления, который я часто создавал и использовал, называется
HtmlLabel, который расширяет
класс RichEditableText для обеспечения простой поддержки HTML-текста:
<?xml version="1.0" encoding="utf-8"?> <s:RichEditableText xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" focusEnabled="false" selectable="false" editable="false"> <fx:Script> <![CDATA[ import flashx.textLayout.conversion.TextConverter; override public function set text(value:String):void { super.textFlow = TextConverter.importToFlow(value, TextConverter.TEXT_FIELD_HTML_FORMAT); } ]]> </fx:Script> </s:RichEditableText>