TabActivity中的Tab标签详细设置

来源:互联网 发布:微领袖学堂源码 编辑:程序博客网 时间:2024/05/01 18:53

参考链接:

http://www.iteye.com/topic/602737

这个写的很不错,我是跟着一步步写下来的,不过到最后也遇到了麻烦,就是不能将Tab标签的文字和图片分开,始终是重合的,而且每个具体的代码,还是搞了许久才出来,故而分享之,希望能给大家带来方便,也谢谢下面的高人,呵呵!

http://www.youmi.net/bbs/thread-102-1-4.html

这个和上面的代码是一样的,不过代码不全,对于初学者来说,考验的时候来了,完善就是提高的过程,不要怕麻烦!

下面就根据上面的参考自己写的,当然大部分是相同的,不过有详细的注释,完整的代码

如果有什么不明白就留言吧!呵呵

首先结果图:

图1:

图2:



 图3:


当然界面没有前面的仁兄好看,我是讲究实用,美化需要自己慢慢做了

呵呵

 

下面直接代码:

 

Java代码  收藏代码
  1. package com.woclub.tabactivitytest;  
  2.   
  3.   
  4. import android.app.TabActivity;  
  5. import android.content.res.ColorStateList;  
  6. import android.graphics.Color;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.view.Gravity;  
  10. import android.view.View;  
  11. import android.widget.ImageView;  
  12. import android.widget.LinearLayout;  
  13. import android.widget.TabHost;  
  14. import android.widget.TabWidget;  
  15. import android.widget.TextView;  
  16. import android.widget.TabHost.OnTabChangeListener;  
  17.   
  18. /** 
  19.  * 总结:在设置Tab的布局的时候首先需要newTabSpec再在其设置setIndicator(Tab名字,Tab的图标), 
  20.  * 尤其需要注意setContent(),它有三种使用方法setContent(int)它是直接在布局文件中设置其布局, 
  21.  * setContent(Intent)可以用Intent指定一个Activity, 
  22.  * setContent(TabContentFactory)可以用一个类来指定其布局的方式 
  23.  * @author Administrator 
  24.  * 
  25.  */  
  26. public class MainActivity extends TabActivity {  
  27.       
  28.     private static final String Tab1 = "Tab1";  
  29.     private static final String Tab2 = "Tab2";  
  30.     private static final String Tab3 = "Tab3";  
  31.     private static final String Tab4 = "Tab4";  
  32.       
  33.     /** Called when the activity is first created. */  
  34.     @Override  
  35.     public void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.main);  
  38.           
  39.           
  40.       //1得到TabHost对象,正对TabActivity的操作通常都有这个对象完成  
  41.         final TabHost tabHost = this.getTabHost();  
  42.         final TabWidget tabWidget = tabHost.getTabWidget();  
  43.           
  44.       //2生成一个Intent对象,该对象指向一个Activity,当然现在例子比较简单就没有绑定其他的Activity故而不用  
  45.       //3生成一个TabSpec对象,这个对象代表了一个Tab页  
  46.         TabHost.TabSpec tabSpec = tabHost.newTabSpec(Tab1);   
  47.       //设置该页的indicator(指示器)设置该Tab页的名字和图标,以及布局  
  48.         tabSpec.setIndicator(composeLayout("爽哉", R.drawable.coke))  
  49.         .setContent(R.id.view1);  
  50.       //4将设置好的TabSpec对象添加到TabHost当中  
  51.         tabHost.addTab(tabSpec);  
  52.           
  53.         //第二个Tab  
  54.         tabHost.addTab(tabHost.newTabSpec(Tab2).setIndicator(composeLayout("安逸", R.drawable.coke))  
  55.                 .setContent(R.id.view2));  
  56.           
  57.       //第三个Tab  
  58.         tabHost.addTab(tabHost.newTabSpec(Tab3).setIndicator(composeLayout("开心", R.drawable.coke))  
  59.                 .setContent(R.id.view3));  
  60.       //第四个Tab  
  61.         tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator(composeLayout("说明", R.drawable.coke))  
  62.                 .setContent(R.id.view4));  
  63.           
  64.  //setContent(TabContentFactory)可以用一个类来指定其布局的方式,前三个都是用的setContent(int)方式  
  65.  //        CustomLayout custom = new CustomLayout(this);  
  66. //        tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator("Tab4", getResources()  
  67. //              .getDrawable(R.drawable.icon))  
  68. //              .setContent(custom));  
  69. //*****************************这是对Tab标签本身的设置*******************************************  
  70.         int width =45;  
  71.         int height =48;  
  72.         for(int i = 0; i < tabWidget.getChildCount(); i++)  
  73.         {  
  74.             //设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果  
  75.             tabWidget.getChildAt(i).getLayoutParams().height = height;  
  76.             tabWidget.getChildAt(i).getLayoutParams().width = width;  
  77.              /**  
  78.               * 下面是设置Tab的背景,可以是颜色,背景图片等  
  79.               */  
  80.              View v = tabWidget.getChildAt(i);  
  81.             if (tabHost.getCurrentTab() == i) {  
  82.                 v.setBackgroundColor(Color.GREEN);  
  83.                 //在这里最好自己设置一个图片作为背景更好  
  84.                 //v.setBackgroundDrawable(getResources().getDrawable(R.drawable.chat));  
  85.             } else {  
  86.                 v.setBackgroundColor(Color.GRAY);  
  87.             }  
  88.         }  
  89.           
  90. //************************************************************************************  
  91.         //设置Tab变换时的监听事件  
  92.         tabHost.setOnTabChangedListener(new OnTabChangeListener() {  
  93.               
  94.             @Override  
  95.             public void onTabChanged(String tabId) {  
  96.                 // TODO Auto-generated method stub  
  97.                 //当点击tab选项卡的时候,更改当前的背景  
  98.                 for(int i = 0; i < tabWidget.getChildCount(); i++)  
  99.                 {  
  100.                 View v = tabWidget.getChildAt(i);  
  101.                 if (tabHost.getCurrentTab() == i) {  
  102.                     v.setBackgroundColor(Color.GREEN);  
  103.                 } else {  
  104.                     //这里最后需要和上面的设置保持一致,也可以用图片作为背景最好  
  105.                     v.setBackgroundColor(Color.GRAY);  
  106.                 }  
  107.                 }  
  108.             }  
  109.         });  
  110.           
  111.     }  
  112. //#################################################################这是设置TabWidget的布局  
  113.     /**  
  114.      * 这个设置Tab标签本身的布局,需要TextView和ImageView不能重合  
  115.      * s:是文本显示的内容  
  116.      * i:是ImageView的图片位置  
  117.      * 将它设置到setIndicator(composeLayout("开心", R.drawable.coke))中  
  118.      */  
  119.     public View composeLayout(String s, int i){  
  120.         Log.e("Error""composeLayout");  
  121.         LinearLayout layout = new LinearLayout(this);  
  122.         layout.setOrientation(LinearLayout.VERTICAL);  
  123.           
  124.         TextView tv = new TextView(this);  
  125.         tv.setGravity(Gravity.CENTER);  
  126.         tv.setSingleLine(true);  
  127.         tv.setText(s);  
  128.         tv.setTextColor(Color.RED);  
  129.         layout.addView(tv,   
  130.                 new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));  
  131.           
  132.         ImageView iv = new ImageView(this);  
  133.         iv.setImageResource(i);  
  134.         layout.addView(iv,   
  135.                 new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));  
  136.         return layout;  
  137.     }  
  138.     //#################################################################  
  139.       
  140. }  

 
 我都有详细的注释,估计大家都能看懂的,有些地方给了提示,扩展的需要就需要自己去完成了

下面是一个两个布局文件

一个是在layout中设置:

 

Java代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!--   
  3. 一个典型的标签Activity  是由2 部分构成的 且其id都有规定 即:   
  4. * TabWidget 用于展示标签页 id=tabs   
  5. * FrameLayout 用于展示隶属于各个标签的具体布局 id=tabconten  
  6. * TabHost 用于整个Tab布局 id=TabHost  
  7. 还需注意要将Tab显示在最下面就需要这只LinearLayout时用Bottom  
  8. -->  
  9. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  10.         android:id="@android:id/tabhost"  
  11.         android:layout_width="fill_parent"  
  12.         android:layout_height="fill_parent"  
  13.         >  
  14.     <LinearLayout  
  15.         android:orientation="vertical"  
  16.         android:gravity="bottom"  
  17.         android:layout_width="fill_parent"  
  18.         android:layout_height="fill_parent">   
  19.         <FrameLayout  
  20.             android:id="@android:id/tabcontent"    
  21.             android:layout_width="fill_parent"       
  22.             android:layout_height="200dip" >  
  23.             <RelativeLayout  
  24.                 android:id="@+id/view1"  
  25.                 android:orientation="vertical"  
  26.                 android:layout_width="fill_parent"  
  27.                 android:layout_height="fill_parent">  
  28.                 <TextView  
  29.                 android:id="@+id/text1"  
  30.                 android:layout_width="wrap_content"  
  31.                 android:layout_height="wrap_content"  
  32.                 android:text="需要光临第一个Tab"/>  
  33.                 <ImageView  
  34.                     android:id="@+id/image1"  
  35.                     android:layout_height="wrap_content"  
  36.                     android:layout_below="@id/text1"  
  37.                     android:layout_width="wrap_content"  
  38.                     android:src="@drawable/icon"  
  39.                     />     
  40.             </RelativeLayout>  
  41.               
  42.             <TextView  
  43.                 android:id="@+id/view2"  
  44.                 android:layout_width="fill_parent"  
  45.                 android:layout_height="fill_parent"  
  46.                 android:text="需要光临第二个Tab"/>  
  47.             <TextView  
  48.                 android:id="@+id/view3"  
  49.                 android:layout_width="fill_parent"  
  50.                 android:layout_height="fill_parent"  
  51.                 android:text="需要光临第三个Tab"/>  
  52.             <TextView  
  53.                 android:id="@+id/view4"  
  54.                 android:layout_width="fill_parent"  
  55.                 android:layout_height="fill_parent"  
  56.                   
  57.                 />  
  58.         </FrameLayout>  
  59.         <TabWidget  
  60.             android:id="@android:id/tabs"  
  61.             android:layout_width="fill_parent"  
  62.             android:layout_height="wrap_content">  
  63.         </TabWidget>  
  64.     </LinearLayout>  
  65. </TabHost>  

 还有一个在类中设置,设置都差不多,在此类中设置只是针对每个Tab页面的设置

 

Java代码  收藏代码
  1. package com.woclub.tabactivitytest;  
  2. import android.app.Activity;  
  3. import android.view.Gravity;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.widget.Button;  
  7. import android.widget.EditText;  
  8. import android.widget.ImageView;  
  9. import android.widget.LinearLayout;  
  10. import android.widget.RadioButton;  
  11. import android.widget.RadioGroup;  
  12. import android.widget.TabHost;  
  13. import android.widget.TextView;  
  14. /** 
  15.  * 此类的功能是设置每个Tab标签的布局方式 
  16.  * 使用方法 
  17.  * CustomLayout ct = new CustomLayout(this);   
  18.  * tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));  
  19.  * @author Administrator 
  20.  * 
  21.  */  
  22. public class CustomLayout implements TabHost.TabContentFactory{  
  23.   
  24.     private Activity myActivity;  
  25.     private LayoutInflater layoutHelper;//用于实例化布局  
  26.     private LinearLayout layout;  
  27.     //构造函数,从外面传递参数Activity  
  28.     public CustomLayout(Activity myActivity)  
  29.     {  
  30.         this.myActivity = myActivity;  
  31.         //通过getLayoutInflater从Activity中得到一个实例化的LayoutInflater  
  32.         layoutHelper = myActivity.getLayoutInflater();  
  33.     }  
  34.     /** 
  35.      * 根据不同的Tab创建不同的视图 
  36.      */  
  37.     @Override  
  38.     public View createTabContent(String tag) {  
  39.         // TODO Auto-generated method stub  
  40.         return addCustomView(tag);  
  41.     }  
  42.       
  43.     /** 
  44.      * 根据Tab的id设置不同Tab的view 
  45.      * 这是普通的设置方式,设置每个Tab的布局 
  46.      * @param id 
  47.      * @return 
  48.      */  
  49.     private View addCustomView(String id)  
  50.     {  
  51.         layout = new LinearLayout(myActivity);  
  52.         layout.setOrientation(LinearLayout.HORIZONTAL);  
  53.   
  54.         if(id.equals("Tab1"))  
  55.         {  
  56.             ImageView iv = new ImageView(myActivity);  
  57.             iv.setImageResource(R.drawable.chat);  
  58.             //设置layout的布局,将一个ImageView添加到其中,并设置ImageView的布局格式,addView的第二个参数是设置ImageView的width和Height  
  59.             layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));  
  60.         }  
  61.         else if(id.equals("Tab2"))  
  62.         {  
  63.             //第一个控件,注意每添加一个空间都需要用addView添加到layout中  
  64.             EditText edit = new EditText(myActivity);  
  65.             layout.addView(edit, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));  
  66.             //第二个控件  
  67.             Button button = new Button(myActivity);  
  68.             button.setText("确定");  
  69.             button.setWidth(100);  
  70.             layout.addView(button, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));  
  71.             //第三个控件  
  72.             RadioGroup rGroup = new RadioGroup(myActivity);    
  73.             rGroup.setOrientation(LinearLayout.HORIZONTAL);    
  74.             RadioButton radio1 = new RadioButton(myActivity);    
  75.             radio1.setText("Radio A");    
  76.             rGroup.addView(radio1);    
  77.             RadioButton radio2 = new RadioButton(myActivity);    
  78.             radio2.setText("Radio B");    
  79.             rGroup.addView(radio2);    
  80.                 
  81.             layout.addView(rGroup,    
  82.                     new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));    
  83.         }  
  84.         else if(id.equals("Tab3"))  
  85.         {  
  86.             TextView text = new TextView(myActivity);  
  87.             text.setText("the third TextView");  
  88.             text.setGravity(Gravity.CENTER);  
  89.             layout.addView(text);  
  90.         }  
  91.         else if(id.equals("Tab4"))  
  92.         {  
  93.             LinearLayout.LayoutParams param3 =    
  94.                 new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);    
  95.              //在这里面又引用了布局文件来设置控件  
  96.             layout.addView(layoutHelper.inflate(R.layout.hello, null),param3);  
  97.         }  
  98.         return layout;  
  99.     }  
  100.       
  101.   
  102.   
  103. }  

 好了,该说的都在代码中说明了

希望大家喜欢,做的粗糙,就由大家去改进吧!

呵呵!

欢迎大家的讨论


转:http://hao3100590.iteye.com/blog/974343