2013-06-03 4 views
2

В приведенном ниже примере мобильных мобильных приложений Flex, почему в списке нет значков?Использование MultiDPIBitmapSource с IconItemRenderer - тестовый пример и скриншот прилагается

Скриншот:

enter image description here

App.mxml (просто добавьте к пустому мобильного проекта Flex в Flash Builder 4.7):

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       applicationDPI="160"> 
    <fx:Declarations> 
     <s:MultiDPIBitmapSource id="EN_ICON" 
       source160dpi="@Embed('low-res/en_US.png')" 
       source240dpi="@Embed('mid-res/en_US.png')" 
       source320dpi="@Embed('high-res/en_US.png')"/> 
     <s:MultiDPIBitmapSource id="RU_ICON" 
       source160dpi="@Embed('low-res/ru_RU.png')" 
       source240dpi="@Embed('mid-res/ru_RU.png')" 
       source320dpi="@Embed('high-res/ru_RU.png')"/> 
     <s:MultiDPIBitmapSource id="DE_ICON" 
       source160dpi="@Embed('low-res/de_DE.png')" 
       source240dpi="@Embed('mid-res/de_DE.png')" 
       source320dpi="@Embed('high-res/de_DE.png')"/> 
    </fx:Declarations> 

    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 

      private const LANGUAGES:ArrayCollection = new ArrayCollection([ 
       { icon: EN_ICON, locale: 'en_US', label: 'English' }, 
       { icon: RU_ICON, locale: 'ru_RU', label: 'Русский' }, 
       { icon: DE_ICON, locale: 'de_DE', label: 'Deutsch' } 
      ]); 
     ]]> 
    </fx:Script> 

    <s:List 
     width="100%" 
     height="100%" 
     dataProvider="{LANGUAGES}"> 
     <s:itemRenderer> 
      <fx:Component> 
       <s:IconItemRenderer labelField="label" iconField="icon" /> 
      </fx:Component> 
     </s:itemRenderer> 
    </s:List> 
</s:Application> 

Значки (любезность пользователя koppi @ openclipart.org и размещено в рубриках: src/low-res, src/mid-res, src/high-res):

enter image description here

enter image description here

enter image description here

ответ

2

Проблема в том, что ваша коллекция массивов LANGUAGES создается до создания объектов 3 MultiDPIBitmapSource. Таким образом, каждый элемент в dataProvider имеет null в поле icon.

Не знаю, в какой момент жизненного цикла компонента будут созданы теги в тегах <fx:Declarations>, но я знаю, что они должны быть созданы к тому времени, когда будет отправлено событие «creationComplete». Фактически, как подтвердил OP, объекты в теге объявлений уже были созданы, когда отправлено событие «initialize».

Если вы создаете массив массивов LANGUAGES в обработчике событий «creationComplete», он будет работать правильно.

+0

Спасибо, я перевел его на 'initialize', и теперь он работает –

+0

+1; однако что-то не имеет смысла в этом ответе. Если перемещение кода установки массива в обработчик инициализации устраняет проблему; то утверждение, что 'fx: Declarations' не создается до тех пор, пока' creationComplete() 'не будет false. – JeffryHouser

+1

@ Reboog711 Я хотел сказать, что я знаю, что объекты в тегах объявлений * будут созданы * к моменту отправки события «creationComplete». И, как выяснил OP, они были созданы к тому времени, когда было отправлено событие «initialize».Я отредактирую, чтобы сделать эту часть понятной, спасибо! –

-1

Я не совсем уверен, если это будет исправить вашу проблему, но всякий раз, когда я использую Вставить, я использую его так:

@Embed(source='GenericImageFileName.png')

+0

-1; Я не вижу, как/почему это отличается от того, что было опубликовано в вопросе; кроме использования другого пути. – JeffryHouser

+0

Мой вопрос не в том, чтобы «Вставить изображение». Мой вопрос заключается в использовании 'MultiDPIBitmapSource' с' IconItemRenderer' для поддержки нескольких экранных DPI. –

+0

Я работаю с flex в течение почти 5 лет, и я столкнулся с множеством особенностей, которые вызывают неправильное поведение без каких-либо указаний относительно того, почему. Наверное, мне следовало бы быть яснее, что я говорю о синтаксисе и игнорирую фактический путь. Я просто копировал/вставлял код, над которым работал. Если вложение не работало, изображение не было бы отображено и, возможно, оно не произвело ошибку. – jugg1es