Android学习之Tab控件(使用TabHost和与Tab对应的Menu,动态更改Tabhost的Tab的背景图标,用到Ratingbar控件)

来源:互联网 发布:网络交换机怎么连接 编辑:程序博客网 时间:2024/04/30 01:16

刚接触Android,按Boss要求要做一个能使用Tab分并且ListView显示内容的程序,其中还要包含RatingBar控件使得用户可以自行评分,并且当Tab标签切换时能改变默认风格使得动态更改Tab的背景或者图标。参考了很多名家大作,受教颇多,下面我把我自己的点点经验和大家分享一下。

 先给图:

a.这是没有更改Tab默认设置之前                                           b.这个是自定义Tab,这里设置的是动态更改背景,动态更改图标也是  样,当然我的界面不太美观。。。

这是没有更改Tab默认设置之前这是自定义Tab,这里设置的是动态更改背景,动态更改图标也是一样的,当然我的界面不太美观。。。

这里是做了个切换再来一张,反正有地儿。。。

   各位可以看到我所用的图片还有基本框架有那么点眼熟,又有点四不像。。。。是了,创新源于模仿对不?我这个就是个大杂烩其实。。。

http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html写的非常好。。。。

以及http://www.eoeandroid.com/thread-1035-1-1.html这篇是对于Android中Tab组件经典代码的分析说的也不错。。。这个的

源码地址是http://www.pudn.com/downloads338/sourcecode/comm/android/detail1480789.html,作者不详。是基于menu的Tab实例,很容易上手。

1.布局

回归正传,首先说一下布局:

从我的工程中可以看到,有两个布局文件。一个用来填充列表的list_views.xml还有一个就是main.xml,除此之外还定义了三个menu文件(当然你有几个Tab就定义几个,当然还要在main.xml里添加供显示的控件)。

Tabs工程

list_views.xml

 

main.xml

menu的我只贴一个,因为都差不多。

2.源程序代码

添加Tab

 

 初始化Tab背景

当点击tab选项卡的时候,更改当前的背景,并装载对应的 menu

RatingBar的不能映射,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,所以我们必须要自己写一个Adapter继承BaseAdapter,并实现其 getView()。Adapter 显示中 每一行就是一个View 你可以把这个View 定义成任何子布局。

获取数据。HashMap的每个键值数据映射到布局文件中对应id的组件上。下面做适配,new一个MyAdapter参数一次是:this,布局文件(list_views.xml),HashMap的 title 和 info,img等。布局文件的组件id,title,info,img等。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

获取填充Listview

3.完整代码

listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

  系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的list_views.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那 再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。