创新源于模仿之一:TabActivity的美化

来源:互联网 发布:短线交易软件 编辑:程序博客网 时间:2024/05/23 12:02

今天开始一个新专题:创新源于模仿。


原文出处:http://blog.csdn.net/sharetop/article/details/6194438

第一篇从TabActivity着手,一直以为Android中的TabActivity只能放在上面,只能如此丑陋,直到有一天看到“米聊”。

 

咋一看,软件下面的那个菜单栏,觉得像是用LinearLayout+Button来实现的,但事实上,它却是一个Tab!
怎么看出来的?我就不多说了,你懂的。

下面我们来抽丝剥茧,一步步分析它的实现过程。

1.TabActivity的布局

[xhtml] view plaincopy
  1. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:id="@android:id/tabhost"   
  3.     android:layout_width="fill_parent"   
  4.     android:layout_height="fill_parent"  
  5.   >  
  6.     <LinearLayout   
  7.         android:orientation="vertical"   
  8.         android:layout_width="fill_parent"   
  9.         android:layout_height="fill_parent">  
  10.           
  11.               
  12.         <FrameLayout   
  13.             android:gravity="center"   
  14.             android:id="@android:id/tabcontent"   
  15.             android:layout_width="fill_parent"   
  16.             android:layout_height="wrap_content"   
  17.             android:layout_weight="1.0" >  
  18.               
  19.             <LinearLayout android:id="@+id/first"  
  20.                 android:orientation="vertical"  
  21.                 android:background="#ffffff"  
  22.                 android:layout_width="fill_parent"  
  23.                 android:layout_height="fill_parent"  
  24.                >  
  25.                 <TextView android:layout_width="fill_parent"  
  26.                     android:layout_height="fill_parent"  
  27.                     android:text="first tab" />  
  28.             </LinearLayout>  
  29.             <LinearLayout android:id="@+id/second"  
  30.                 android:orientation="vertical"  
  31.                 android:background="#ffffff"  
  32.                 android:layout_width="fill_parent"  
  33.                 android:layout_height="fill_parent"  
  34.                 >  
  35.                 <TextView android:layout_width="fill_parent"  
  36.                     android:layout_height="fill_parent"  
  37.                     android:text="second tab" />  
  38.             </LinearLayout>  
  39.               
  40.         </FrameLayout>  
  41.           
  42.         <TabWidget   
  43.             android:id="@android:id/tabs"   
  44.             android:background="@drawable/tab_bottom_bg"   
  45.             android:padding="3.0dip"   
  46.             android:layout_width="fill_parent"   
  47.             android:layout_height="wrap_content"   
  48.             android:layout_weight="0.0" />  
  49.           
  50.     </LinearLayout>      
  51. </TabHost>  

 

 

我们看到,要自定义一个位于屏幕下方的TAB标签,首先我们不能使用缺省的TabActivity实现了,啥事都要自己亲力亲为。
很好理解,把tabs放在tabcontent下面就可以了。其它不多说了。


2.MainActivity的实现代码


先看看缺省的实现代码,不复杂,省略一些无关的东西:

 

[java] view plaincopy
  1. private void setIndicator(int icon, int title, int view) {  
  2.         String str = getResources().getString(title);  
  3.           
  4.         TabHost.TabSpec localTabSpec=tabhost.newTabSpec(str).setIndicator(str,getResources().getDrawable(icon)).setContent(view);  
  5.         tabhost.addTab(localTabSpec);  
  6.     }  

 

可以测试一下,效果出来了吧,虽然有点丑,但它真的在屏幕下方了。

 

3.美化TAB标签

 

现在我们来定制这个TAB的标签。先看代码:

[java] view plaincopy
  1. private void setIndicator(int icon, int title, int view) {  
  2.       
  3.     View localView = LayoutInflater.from(this.tabhost.getContext()).inflate(R.layout.main_activity_tab, null);  
  4.     ((ImageView)localView.findViewById(R.id.main_activity_tab_image)).setBackgroundResource(icon);  
  5.     ((TextView)localView.findViewById(R.id.main_activity_tab_text)).setText(title);  
  6.       
  7.     String str = getResources().getString(title);  
  8.       
  9.     TabHost.TabSpec localTabSpec = tabhost.newTabSpec(str).setIndicator(localView).setContent(view);  
  10.     tabhost.addTab(localTabSpec);  
  11.       
  12. }  

 

注意到这个main_activity_tab的layout了吧,看看它的内容:

 

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:gravity="center"   
  4.     android:orientation="vertical"   
  5.     android:id="@id/tabsLayout"   
  6.     android:background="@drawable/tab_item_bkg"   
  7.     android:padding="3.0dip"   
  8.     android:layout_width="wrap_content"   
  9.     android:layout_height="wrap_content"   
  10.     android:layout_marginTop="3.0dip"   
  11.     android:layout_marginBottom="3.0dip"  
  12.   >  
  13.       
  14.     <FrameLayout   
  15.         android:layout_width="fill_parent"   
  16.         android:layout_height="fill_parent"   
  17.         android:layout_weight="0.6">  
  18.           
  19.         <ImageView   
  20.             android:layout_gravity="center"   
  21.             android:id="@id/main_activity_tab_image"   
  22.             android:layout_width="wrap_content"   
  23.             android:layout_height="wrap_content"   
  24.             android:layout_marginTop="2.0dip"   
  25.             android:scaleType="center" />  
  26.           
  27.     </FrameLayout>  
  28.       
  29.     <TextView   
  30.         android:textSize="12.0dip"   
  31.         android:textColor="@drawable/tab_text_selector"   
  32.         android:id="@id/main_activity_tab_text"   
  33.         android:layout_width="wrap_content"   
  34.         android:layout_height="wrap_content"   
  35.         android:text="Title" />  
  36. </LinearLayout  

 

这个文件定义了每个TAB标签的样式,tab_item_bkg定义每个item的背景(包括focused/selected/pressed),每个item上面的图标和下面的文字都在代码中动态定义即可。其中tab_text_selector则定义文字的颜色。

 

剩下的事情就越发明显了,不用多说了。