自定义Tabactivity, tab在底部

根据网上资料,写了一个通用的类似模板的类MyTabActivity,实现一个图标Icon+文字Label的TabActivity,应用的类只要把Icon和Label加上去,对应每个Activity,就可以建立一个TabActivity了。

 

1.      模板类MyTabActivity.java(可以重用)

[java]  view plain copy
  1. package amao.callbye;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import android.app.Activity;  
  8. import android.app.TabActivity;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.graphics.Color;  
  12. import android.graphics.drawable.Drawable;  
  13. import android.os.Bundle;  
  14. import android.util.Log;  
  15. import android.view.Gravity;  
  16. import android.view.Window;  
  17. import android.widget.ImageView;  
  18. import android.widget.LinearLayout;  
  19. import android.widget.TabHost;  
  20. import android.widget.TabHost.OnTabChangeListener;  
  21. import android.widget.TabHost.TabSpec;  
  22. import android.widget.TextView;  
  23.   
  24. /** 
  25.  * Abstract TabActivity with icon+text TabSpec support for each Activity 
  26.  * Sub class need set "layout" and "selectDrawable"(tab selected background image) in constructor 
  27.  * And implement getMyTabList() to add tab configuration 
  28.  *  
  29.  * @author Anderson Mao, 2012-05-01 
  30.  */  
  31. public abstract class MyTabActivity extends TabActivity {  
  32.     private static String TAG_NAME = MyTabActivity.class.getSimpleName();   
  33.       
  34.     private TabHost tabHost;  
  35.       
  36.     private int tabLayout;  
  37.     private int selectDrawable;  
  38.     private Drawable selectBackground;  
  39.       
  40.     private int textColor = Color.GRAY;  
  41.     private int selectTextColor = Color.LTGRAY;  
  42.       
  43.     private Map<String, TabView> tabViewMap = new HashMap<String, TabView>();  
  44.     private String tabViewTagPrev=null;  
  45.       
  46.     public abstract List<MyTab> getMyTabList();  
  47.       
  48.     public MyTabActivity(int tabLayout, int selectDrawable){  
  49.         this.tabLayout = tabLayout;  
  50.         this.selectDrawable = selectDrawable;  
  51.     }  
  52.       
  53.     @Override  
  54.     public void onCreate(Bundle savedInstanceState) {  
  55.         super.onCreate(savedInstanceState);  
  56.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  57.         setContentView(tabLayout);  
  58.         tabHost = getTabHost(); // Get TabHost after setContentView()   
  59.         //  
  60.         initTabHost();  
  61.     }  
  62.       
  63.     private void initTabHost(){  
  64.         selectBackground = this.getResources().getDrawable(selectDrawable);  
  65.           
  66.         int index = 0;  
  67.         // Create TabSpec for each MyTab. The first tab is the default  
  68.         String  defaultTag = null;  
  69.         TabView defaultTabView = null;  
  70.         List<MyTab> myTabList = getMyTabList();  
  71.         for(MyTab myTab: myTabList){  
  72.             index++;  
  73.             String tag = Integer.toString(index);  
  74.             TabView view = new TabView(this, myTab.icon, myTab.text);  
  75.             TabSpec tabSpec = tabHost.newTabSpec(tag)  
  76.                     .setIndicator(view)  
  77.                     .setContent(new Intent(this, myTab.activity))  
  78.                     ;  
  79.             tabViewMap.put(tag, view);  
  80.             tabHost.addTab(tabSpec);  
  81.             if(defaultTag == null){  
  82.                 defaultTag = tag;  
  83.                 defaultTabView = view;  
  84.             }  
  85.         }  
  86.         // Listener on tab change  
  87.         tabHost.setOnTabChangedListener( new OnTabChangeListener(){  
  88.             @Override  
  89.             public void onTabChanged(String tabId){  
  90.                 Log.d(TAG_NAME,"change tab: id="+tabId+", prevId="+tabViewTagPrev);  
  91.                 if(tabViewTagPrev!=null){  
  92.                     // Reset prev tab  
  93.                     TabView tvPrev = tabViewMap.get(tabViewTagPrev);  
  94.                     if(tvPrev!=null){  
  95.                         tvPrev.setBackgroundDrawable(null);  
  96.                         tvPrev.textView.setTextColor(textColor);  
  97.                     }  
  98.                 }  
  99.                 // Set current selected tab  
  100.                 TabView tv = tabViewMap.get(tabId);  
  101.                 if(tv!=null){  
  102.                     tv.setBackgroundDrawable(selectBackground);  
  103.                     tv.textView.setTextColor(selectTextColor);  
  104.                 }  
  105.                 //  
  106.                 tabViewTagPrev = tabId;  
  107.             }  
  108.         });  
  109.         // Set default tab  
  110.         if(defaultTag != null){  
  111.             defaultTabView.setBackgroundDrawable(selectBackground);  
  112.             defaultTabView.textView.setTextColor(selectTextColor);  
  113.             tabViewTagPrev = defaultTag;  
  114.         }  
  115.     }  
  116.       
  117.     /** 
  118.      * Layout for each TabSpec 
  119.      */  
  120.     private class TabView extends LinearLayout {    
  121.         private ImageView imageView ;  
  122.         private TextView textView;  
  123.           
  124.         public TabView(Context c, int icon, String text) {  
  125.             super(c);  
  126.             setOrientation(VERTICAL);  
  127.             setGravity(Gravity.CENTER);  
  128.               
  129.             imageView = new ImageView(c);  
  130.             imageView.setImageDrawable(this.getResources().getDrawable(icon));  
  131.             imageView.setBackgroundColor(Color.TRANSPARENT);  
  132.             addView(imageView);  
  133.               
  134.             textView = new TextView(c);  
  135.             textView.setText(text);  
  136.             textView.setTextColor(textColor);  
  137.             textView.setGravity(Gravity.CENTER);  
  138.             addView(textView);  
  139.         }  
  140.     }  
  141.       
  142.     /** 
  143.      * Options for each TabSpec. Icon + Text + Activity 
  144.      */  
  145.     public class MyTab{  
  146.         private int icon;  
  147.         private String text;  
  148.         private Class<? extends Activity> activity;  
  149.           
  150.         public MyTab(int icon, String text, Class<? extends Activity> activity){  
  151.             this.icon = icon;  
  152.             this.text = text;  
  153.             this.activity = activity;  
  154.         }  
  155.     }  
  156. }  

2.      实际应用类CallbyeTabActivity.java(使用MyTabActivity)

[java]  view plain copy
  1. package amao.callbye;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. /** 
  7.  * TabActivity by configuration 
  8.  * @see MyTabActivity.java 
  9.  *  
  10.  * @author Anderson Mao, 2012-05-01 
  11.  */  
  12. public class CallbyeTabActivity extends MyTabActivity {  
  13.       
  14.     public CallbyeTabActivity(){  
  15.         super(R.layout.tab, R.drawable.icon_tab_select);  
  16.     }  
  17.       
  18.     @Override  
  19.     public List<MyTab> getMyTabList(){  
  20.         List<MyTab> myTabList = new ArrayList<MyTab>();  
  21.         //  
  22.         myTabList.add(new MyTab(R.drawable.icon_home, getString(R.string.tab_home), CallbyeActivity.class) );  
  23.         myTabList.add(new MyTab(R.drawable.icon_setting, getString(R.string.tab_setting), SettingActivity.class) );  
  24.         myTabList.add(new MyTab(R.drawable.icon_help, getString(R.string.tab_help), HelpActivity.class) );  
  25.         myTabList.add(new MyTab(R.drawable.icon_history, getString(R.string.tab_info), InfoActivity.class) );  
  26.         //  
  27.         return myTabList;  
  28.     }  
  29. }  

3.      Layout (tab.xml)

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TabHost android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:id="@android:id/tabhost"  
  5.     xmlns:android="http://schemas.android.com/apk/res/android"  
  6.     >  
  7.     <RelativeLayout  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.         android:orientation="vertical"  
  11.         android:padding="0dip"  
  12.         >  
  13.         <FrameLayout  
  14.             android:layout_width="fill_parent"  
  15.             android:layout_height="fill_parent"  
  16.             android:id="@android:id/tabcontent"  
  17.             >  
  18.         </FrameLayout>  
  19.         <TabWidget  
  20.             android:layout_width="fill_parent"  
  21.             android:layout_height="50dip"  
  22.             android:id="@android:id/tabs"  
  23.             android:background"@android:color/black"  
  24.             android:layout_alignBottom = "@android:id/tabcontent"  
  25.             />  
  26.     </RelativeLayout>  
  27. </TabHost>  

4.      参考:
截图ScreenShoot: http://ww1.sinaimg.cn/bmiddle/827d0836gw1dt42i7tim0j.jpg

自定义Tabactivity, tab在底部_第1张图片


http://blog.csdn.net/andersonmao/article/details/7722242

你可能感兴趣的:(自定义Tabactivity, tab在底部)