목록이있는 간단한 설명 선을 만들었습니다. 이처럼 는 :목록이 포함 된 Spark Mobile Callout이 올바르게 배치/크기 조정되지 않습니다.
여기<s:Callout xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoLayout="true" >
<fx:Declarations>
<!-- Platzieren Sie nichtvisuelle Elemente (z. B. Dienste, Wertobjekte) hier -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import com.skill.flextensions.factories.StyledClassFactory;
import mx.collections.IList;
import spark.components.IconItemRenderer;
import spark.components.List;
import spark.events.IndexChangeEvent;
import spark.layouts.HorizontalAlign;
import spark.layouts.VerticalLayout;
private var _list:List;
//
// PUBLIC PROPERTIES
//
private var _dataProvider:IList;
private var _dataProviderChanged:Boolean = false;
public function get dataProvider():IList
{
return _dataProvider;
}
public function set dataProvider(value:IList):void
{
_dataProvider = value;
_dataProviderChanged = true;
this.invalidateProperties();
}
private var _itemRenderer:IFactory;
private var _itemRendererChanged:Boolean = false;
public function get itemRenderer():IFactory
{
return _itemRenderer;
}
public function set itemRenderer(value:IFactory):void
{
_itemRenderer = value;
_itemRendererChanged = true;
this.invalidateProperties();
}
//
// @ SUPER
//
override protected function commitProperties():void
{
super.commitProperties();
if(_dataProviderChanged)
{
_dataProviderChanged = false;
_list.dataProvider = _dataProvider;
// TODO
// we have to remeasure, after dataprovider updated
// unfortunately, this doesn't work:
/*
_list.invalidateSize();
_list.invalidateDisplayList();
_list.validateNow();
invalidateSize();
invalidateDisplayList();
validateNow();
*/
// so we will have to find a workaround for this situation.
}
if(_itemRendererChanged)
{
_itemRendererChanged= false;
_list.itemRenderer = getItemRenderer();
}
}
override protected function createChildren():void
{
_list = new List;
_list.top = _list.bottom = 0;
_list.itemRenderer = getItemRenderer();
_list.addEventListener(IndexChangeEvent.CHANGE , onChange , false , 0 , true);
var l:VerticalLayout = new VerticalLayout;
l.gap = 0;
l.requestedMinRowCount = 0;
l.horizontalAlign = HorizontalAlign.CONTENT_JUSTIFY;
_list.layout = l;
this.addElement(_list);
}
//
// @ LIST
//
protected function onChange(e:IndexChangeEvent):void
{
var obj:Object = _list.selectedItem;
this.removeAllElements();
_list = null;
this.close(true , obj);
}
private function getItemRenderer():IFactory
{
if(! _itemRenderer)
{
var fac:StyledClassFactory = new StyledClassFactory(IconItemRenderer);
var props:Object = new Object;
props.messageField = "message";
props.labelField = "";
props.styleName = "itemName";
props.iconField = "icon";
var styles:Object = new Object;
styles.messageStyleName = "itemHeadline";
fac.properties = props;
fac.styles = styles;
return fac;
}
return _itemRenderer;
}
]]>
</fx:Script>
문제이며, 내 콜 아웃이 제대로 측정하지 않습니다. dataProvider가 List에 추가되면 List의 첫 번째 항목 크기가 항상 조정됩니다. List와 사용자 상호 작용이 발생하면 갑자기 크기가 조정되어 가장 큰 항목으로 조정됩니다.
불행히도 CallOut-Position은 변경되지 않아 잘못 배치 된 설명 선으로 이어지고 때로는 화면 절반에도 벗어납니다.
그래서 콜 아웃을 열기 전에 목록의 크기가 올바른지 확인하고 싶습니다.
어떻게하면됩니까? 귀하의 의견에 많은 thx.
맞춤 구성 요소에 measure() 메소드를 구현하면이 문제가 해결됩니다. – JeffryHouser
@ Reboog711 네, 아마도 이것을 할 것입니다. 하지만 지금은 시간을 찾지 못합니다. 완성 된 코드는 곧 게시 될 것입니다. 많은 thx. –