为了节约swf文件的大小,可以采取动态创建组件的方式,那么动态创建组件就要考虑到组件容器自适应大小。
比如:
<s:BorderContainer x="5" y="5" width="100%" right="5" left="5"
autoLayout="true" id="bc">
<s:layout >
<s:TileLayout />
</s:layout>
</s:BorderContainer>
我要在上边这个容器里动态装入一些组件,很有可能容器的高度不够装下多个组件,这个时候,就要让程序动态的改变容器的大小。
改变容器的大小可以根据添加的最后一个组件的top和height来决定,那么我们什么时候才能获取得最后一个组件的大小呢?看下边的代码:
public function init():void{
var user:TblBsUserType = new TblBsUserType();
function initFormItem(label:String,porp:String):FormItem{
var fi:FormItem =ElementFactory.createFormItem(label,user,porp);
fi.setStyle("paddingTop",10);
fi.setStyle("paddingLeft",20);
bc.addElement(fi);
return fi;
}
initFormItem("用户编码:","butyId");
initFormItem("用 户 名:","butyName");
initFormItem("用户密码:","butyPassword");
var fi:FormItem=initFormItem("用户角色:","butySate");
//注意下边这种方式可以设置bc的高度吗???
bc.height =fi.top+ fi.height+10;
}
如果动态创建组件,那么直接获取组件的高度是不行的。像上边这种情况,fi.height的值多数情况是0.
其实根据flex组件的生命周期,我们知道只有在creationComplete事件的时候,组件才完成了它所有的初始化工作,包括组件的位置,样式,大小等信息。所以,要想获得组件的高宽,我们应该在creationComplete事件中来完成这个任务。所以上边
bc.height=fi.top+fi.height+10;
应该修改为:
fi.addEventListener("creationComplete",function(){
bc.height =fi.top+ fi.height+10;
});
这样才可以正确设置父容器的高度。