在 [层叠容器](../../container/viewStack/README.md) 章节,我们介绍了 ViewStack,而本节介绍的 TabBar 可以用来控制 ViewStack 的显示。TabBar 会根据数据源,显示一组按钮,并且在同一时间,只有一个按钮会被选中,并且如果数据源是一个ViewStack 的话,那么 TabBar 的选中项索引将和 ViewStack 的选中项索引保持一致。 ## 用法1:结合ViewStack 修改 [层叠容器](../../container/viewStack/README.md) 章节的例子,不再用 timer 控制 ViewStack 的切换,而是绑定到 TabBar 上面: ~~~ typescript class TabBarDemo extends eui.Group { constructor() { super(); } protected createChildren(): void { super.createChildren(); var theme = new eui.Theme(`resource/default.thm.json`, this.stage); var exml = ` `; var tabBar = new eui.TabBar(); var viewStack = new eui.ViewStack(); viewStack.y = 100; //创建 3 个 group ,每个 group 里面有 1 个按钮 for (var i: number = 0; i < 3; i ++) { var group: eui.Group = new eui.Group(); group.name = "Group" + i; var btn: eui.Button = new eui.Button(); btn.label = "Button" + i; group.addChild(btn); viewStack.addChild(group); } //将 tabBat 的数据源设置为 viewStack tabBar.dataProvider = viewStack; tabBar.itemRendererSkinName = exml; viewStack.selectedIndex = 1; this.addChild(viewStack); this.addChild(tabBar); } } ~~~ > 上面代码中为循环产生的group设置了名称(通过name属性),这样TabBar的显示,就可以根据Group的名称来做。由于ViewStack实现的是ICollection接口,它默认会取子项的name属性,就是说,想显示在TabBar的文本,必须写在子项的name属性上。 通过设置 `TabBar.dataProvider` 等于 ViewStack 实例,来实现两者的绑定。 效果: ![](9-4-tabbar-A.png) ## 用法2:结合ArrayCollection TabBar 也可以单独使用的,将数据源设置为一个 ArrayCollection 实例即可。并且可以通过侦听 `ITEM_TAP` 事件,来获取 TabBar 的选中项。示例代码: ~~~ typescript class TabBarDemo extends eui.Group { constructor() { super(); } protected createChildren(): void { super.createChildren(); var theme = new eui.Theme(`resource/default.thm.json`, this.stage); var exml = ` `; var tabBar = new eui.TabBar(); tabBar.dataProvider = new eui.ArrayCollection(["tab1", "tab2", "tab3"]); tabBar.itemRendererSkinName = exml; this.addChild(tabBar); tabBar.addEventListener(eui.ItemTapEvent.ITEM_TAP, this.onBarItemTap, this); } private onBarItemTap(e: eui.ItemTapEvent): void { console.log(e.itemIndex); } } ~~~ 效果: ![](9-4-tabbar-B.png)