Android iconitemrenderer可单击对象?
我正在为android和iOS使用Flash Builder 4.5制作一个移动应用程序,并使用itemRenderer和iconitemrenderer类为我的应用程序制作一个选项列表。由于某些原因,我无法使它们可单击,也无法定义单击时要执行的操作。基本上,我的目标是使用FB的“视图”,当点击一个项目时,切换到一个新的视图。以下是我正在使用的代码:Android iconitemrenderer可单击对象?,android,apache-flex,mxml,itemrenderer,navigator,Android,Apache Flex,Mxml,Itemrenderer,Navigator,我正在为android和iOS使用Flash Builder 4.5制作一个移动应用程序,并使用itemRenderer和iconitemrenderer类为我的应用程序制作一个选项列表。由于某些原因,我无法使它们可单击,也无法定义单击时要执行的操作。基本上,我的目标是使用FB的“视图”,当点击一个项目时,切换到一个新的视图。以下是我正在使用的代码: <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="lib
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:ms="libs/MessageBox-digitalRetro">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:actionContent>
<s:Button id="signin" label="Sign in" click="onSignIn(event)"/>
</s:actionContent>
//code for the clicking of the sign in button
<fx:Script>
<![CDATA[
protected function onSignIn(event:Event):void
{
}
]]>
</fx:Script>
<s:List height="100%" width="100%">
<s:itemRenderer>
<fx:Component>
<s:IconItemRenderer height="100" labelField="name"
iconField="photo" iconHeight="80"
iconWidth="80" messageFunction="getMessage">
<fx:Script>
<![CDATA[
import spark.components.NavigatorContent;
//this first method works
protected function getMessage(o:Object):String
{
return o.message;
}
]]>
</fx:Script>
</s:IconItemRenderer>
</fx:Component>
</s:itemRenderer>
<s:dataProvider>
<s:ArrayCollection>
<fx:Object name="Projects" photo="@Embed('libs/ProjectsIcon2.png')" message="Learn more about what we're working on" clickfn="views/Projects"/>
<fx:Object name="Locate Office" photo="@Embed('libs/google-maps-icon.png')" message="Find directions to our nearest office" clickfn=""/>
<fx:Object name="Contact Us" photo="@Embed('libs/gmailicon.png')" message="Let us know your thoughts!" clickfn=""/>
<fx:Object name="About Us" photo="@Embed('libs/info-icon.png')" message="" clickfn=""/>
</s:ArrayCollection>
</s:dataProvider>
<s:change>
<![CDATA[
// NEW!!!
var ClassReference:Class = getDefinitionByName(event.currentTarget.selectedItem.clickfn) as Class;
navigator.pushView(ClassReference);
]]>
</s:change>
</s:List>
</s:View>
<pre>
<s:dataProvider>
<s:ArrayList>
<s:DataItem name="Projects" message="Learn more about what we're working on" nextView="{views.Projects}" />
<s:DataItem name="Locate Office" message="Find directions to our nearest office" nextView="{views.Locate}" />
<s:DataItem name="Contact Us" message="Let us know your thoughts!" nextView="{views.ContactUs}" />
<s:DataItem name="About Us" message="" nextView="{views.AboutUs}" />
</s:ArrayList></s:dataProvider>
<s:change>
navigator.pushView(event.currentTarget.selectedItem.nextView);
</s:change>
//单击“登录”按钮的代码
编辑:我添加了“更改”标记,它现在可以编译了,但我收到一条错误消息:
ReferenceError:错误#1065:未定义变量项目。
在global/flash.utils::getDefinitionByName()中
at views::MainHomeView/\uuuuuuuu MainHomeView\u列表1\u change()[C:\Users\jlehenbauer\Adobe Flash Builder 4.5\Metters Inc\src\views\MainHomeView.mxml:56]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
位于mx.core::UIComponent/dispatchEvent()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:13128]
位于spark.components::List/commitSelection()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\List.as:1205]
位于spark.components.supportClasses::ListBase/commitProperties()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\supportClasses\ListBase.as:939]
位于spark.components::List/commitProperties()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\List.as:1069]
位于mx.core::UIComponent/validateProperties()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:8209]
位于mx.managers::LayoutManager/validateProperties()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:597]
位于mx.managers::LayoutManager/dophasedinstation()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:813]
位于mx.managers::LayoutManager/dophasedinstationcallback()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1180]
我正在做一个移动应用程序
适用于android和iOS的Flash Builder 4.5
我正在使用itemRenderer和
iconitemrenderer类来生成
我的应用程序的选项列表
实际上,根据您在示例中展示的代码,您没有使用该类;只是上课。您看到的语法如下所示:
<s:List id="list1" height="100%" width="100%" change="navigator.pushView(list1.selectedItem.nextView)">
<s:itemRenderer>
<fx:Component>
<s:IconItemRenderer labelField="name"/>
</fx:Component>
</s:itemRenderer>
<s:dataProvider>
<s:ArrayList>
<s:DataItem name="Projects" message="Learn more about what we're working on" nextView="{views.Projects}" />
<s:DataItem name="Locate Office" message="Find directions to our nearest office" nextView="{views.Locate}" />
<s:DataItem name="Contact Us" message="Let us know your thoughts!" nextView="{views.ContactUs}" />
<s:DataItem name="About Us" message="" nextView="{views.AboutUs}" />
</s:ArrayList>
</s:dataProvider>
</s:List>
是一种语法,用于在MXML中将组件的属性定义为子级。它是指列表组件的itemRenderer属性;它不引用ItemRenderer类
也就是说,错误似乎是您试图引用字符串clickfn=“Projects”
,就好像它是一个类一样。因此会出现类型转换错误。如果您指定完整的类路径,您的运气可能会更好
此外,您的三个项目没有定义clickFn;因此,他们可能会抛出类似的错误 找到了答案。这里有一个解决方案:
<s:List height="100%" width="100%">
<s:itemRenderer>
<fx:Component>
<s:IconItemRenderer height="100" labelField="name"
iconField="photo" iconHeight="80"
iconWidth="80" messageFunction="getMessage">
<fx:Script>
<![CDATA[
import spark.components.NavigatorContent;
protected function getMessage(o:Object):String
{
return o.message;
}
]]>
</fx:Script>
</s:IconItemRenderer>
</fx:Component>
</s:itemRenderer>
<s:dataProvider>
<s:ArrayCollection>
<fx:Object name="Projects" photo="@Embed('libs/ProjectsIcon2.png')" message="Learn more about what we're working on">
</fx:Object>
<fx:Object name="Locate Office" photo="@Embed('libs/google-maps-icon.png')" message="Find directions to our nearest office">
</fx:Object>
<fx:Object name="Contact Us" photo="@Embed('libs/gmailicon.png')" message="Let us know your thoughts!">
</fx:Object>
<fx:Object name="About Us" photo="@Embed('libs/info-icon.png')" message="">
</fx:Object>
</s:ArrayCollection>
</s:dataProvider>
<s:change>
//these if statements were the solution i used. rough, but works well
<![CDATA[
if(event.currentTarget.selectedItem.name == "Projects"){navigator.pushView(Projects);}
if(event.currentTarget.selectedItem.name == "Locate Office"){navigator.pushView(Locations);}
if(event.currentTarget.selectedItem.name == "Contact Us"){navigator.pushView(Contact);}
if(event.currentTarget.selectedItem.name == "About Us"){navigator.pushView(About);}
]]>
</s:change>
</s:List>
//这些if语句就是我使用的解决方案。很粗糙,但效果很好
您可以通过以下操作简化JacobL答案中的更改处理程序逻辑:
<s:List id="list1" height="100%" width="100%" change="navigator.pushView(list1.selectedItem.nextView)">
<s:itemRenderer>
<fx:Component>
<s:IconItemRenderer labelField="name"/>
</fx:Component>
</s:itemRenderer>
<s:dataProvider>
<s:ArrayList>
<s:DataItem name="Projects" message="Learn more about what we're working on" nextView="{views.Projects}" />
<s:DataItem name="Locate Office" message="Find directions to our nearest office" nextView="{views.Locate}" />
<s:DataItem name="Contact Us" message="Let us know your thoughts!" nextView="{views.ContactUs}" />
<s:DataItem name="About Us" message="" nextView="{views.AboutUs}" />
</s:ArrayList>
</s:dataProvider>
</s:List>
按照上面的建议,您可以使用这些条件:
navigator.pushView(event.currentTarget.selectedItem.nextView);
+1,用于提供几乎可运行的代码。嵌入的图像使复制和粘贴运行变得稍微困难;但这比大多数都好。谢谢!它应该在没有图像的情况下运行,您只会得到一条错误消息,并且必须告诉它
继续
IconItemRenderer在ItemRenderer类中,所以我同时使用它们。但是,我明白你对错误的看法。我还没有为其他人定义它,因为我只是在测试,我尝试了你的建议,但代码仍然不起作用。我已经编辑了代码以显示更改。我尝试了上面的代码以及完整路径Package/src/views/Projects
,但仍然无法正常工作;IconItemRenderer不在ItemRenderer类中。至少在你提供给我们的代码中没有。我想我已经解释过了;但我不知道怎样才能说得更清楚。通常,如果它以小写的“itemRenderer”开头,则它是一个属性。如果它以大写的“ItemRenderer”开头,则它是一个类。您只是使用MXML语法将IconItemRenderer类的一个实例分配给列表的itemRenderer属性;不是目录结构。所以,使用点符号views.Projects'不是'views/Projects'@Flextras我将
代码更改为一个函数,该函数应该更改对具有该名称的类实例的引用,但它似乎认为它只是一个变量,而不是一个类。有什么想法吗?