2013-07-21 8 views
0

목록이있는 간단한 설명 선을 만들었습니다. 이처럼 는 :목록이 포함 된 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.

+0

맞춤 구성 요소에 measure() 메소드를 구현하면이 문제가 해결됩니다. – JeffryHouser

+0

@ Reboog711 네, 아마도 이것을 할 것입니다. 하지만 지금은 시간을 찾지 못합니다. 완성 된 코드는 곧 게시 될 것입니다. 많은 thx. –

답변

0

동일한 문제가있었습니다. 나는 그것을 할 수있는보다 우아한 방법이있을 것이라고 확신하지만 이것은 나의 해결책이었다.

  1. 콜 아웃 FlexEvent.CREATION_COMPLETE를 수신 :

    <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" 
        creationComplete="init()"> 
    
  2. 이 레이아웃/크기 다시 실행 콜 아웃을 강제로 : 내 응용 프로그램에서

    function init():void 
    { 
        validateNow(); 
        updatePopUpPosition(); 
    } 
    

을, 나는 목록 데이터를 처리 인구가 약간 다르므로 대신 데이터를 설정 한 후에 init()을 호출해야 할 수도 있습니다.

+0

시도했지만, 내 경우에는 작동하지 않습니다 :(문제는 List 또는 레이아웃에 어딘가에 있어야합니다.) 일시적으로 init를 ResizeEvent.Resize에 바인딩하여 결국 팝업을 다시 배치합니다. 목록은 모든 사용자 상호 작용에서 크기가 조정됩니다. 그러나 처음부터 올바른 크기를 가져 오지 말고 처음부터 올바른 치수를 가져야합니다. 따라서 반답안이 정확합니다 .-) BTW : '사용자 정의'레이아웃을 제거하면, List는 크기가 조정되지 않지만 데이터를 표시 할만큼 크지는 않습니다. –

+0

이상하게도, @Lee Burrows 태그가 지금 당장 작동하지 않습니다. 어쨌든 이것을 얻으시기 바랍니다. 다시 –

+0

당신은 또한 목록 레이아웃에 대한 정당성을 시도 할 수 있습니다 horizontalAlign - 콘텐츠가 골칫거리 인 것으로 정당화되었습니다 –