首先先看一个小例子,接着讲解原理

  1. TabTest.java
  2. view plaincopy to clipboardprint?
  3. package org.hualang.tab;
  4. import android.app.Activity;
  5. import android.app.TabActivity;
  6. import android.graphics.Color;
  7. import android.os.Bundle;
  8. import android.widget.TabHost;
  9. import android.widget.Toast;
  10. import android.widget.TabHost.OnTabChangeListener;
  11. public class TabTest extends TabActivity {
  12. /** Called when the activity is first created. */
  13. TabHost tabhost;
  14. @Override
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. //取得TabHost对象
  19. tabhost = getTabHost();
  20. //为TabHost添加标签
  21. //新建一个newTabSpec(newTabSpec)
  22. //设置其标签和图标(setIndicator)
  23. //设置内容(setContent)
  24. tabhost.addTab(tabhost.newTabSpec("tab1")
  25. .setIndicator("TAB 1",getResources().getDrawable(R.drawable.img1))
  26. .setContent(R.id.text1));
  27. tabhost.addTab(tabhost.newTabSpec("tab2")
  28. .setIndicator("TAB 2",getResources().getDrawable(R.drawable.img2))
  29. .setContent(R.id.text2));
  30. tabhost.addTab(tabhost.newTabSpec("tab3")
  31. .setIndicator("TAB 3",getResources().getDrawable(R.drawable.img3))
  32. .setContent(R.id.text3));
  33. //设置TabHost的背景颜色
  34. //tabhost.setBackgroundColor(Color.argb(150,22,70,150));
  35. //设置TabHost的背景图片资源
  36. tabhost.setBackgroundResource(R.drawable.bg0);
  37. //设置当前显示哪个标签
  38. tabhost.setCurrentTab(0);
  39. //标签切换事件处理,setOnTabChangedListener
  40. tabhost.setOnTabChangedListener(new OnTabChangeListener()
  41. {
  42. public void onTabChanged(String tabId)
  43. {
  44. Toast toast=Toast.makeText(getApplicationContext(), "现在是"+tabId+"标签", Toast.LENGTH_SHORT);
  45. toast.show();
  46. }
  47. });
  48. }
  49. }

main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@android:id/tabhost"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <LinearLayout
  7. android:orientation="vertical"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent">
  10. <TabWidget
  11. android:id="@android:id/tabs"
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content" />
  14. <FrameLayout
  15. android:id="@android:id/tabcontent"
  16. android:layout_width="fill_parent"
  17. android:layout_height="fill_parent">
  18. <TextView
  19. android:id="@+id/text1"
  20. android:layout_width="fill_parent"
  21. android:layout_height="fill_parent"
  22. android:text="选项卡1" />
  23. <TextView
  24. android:id="@+id/text2"
  25. android:layout_width="fill_parent"
  26. android:layout_height="fill_parent"
  27. android:text="选项卡2" />
  28. <TextView
  29. android:id="@+id/text3"
  30. android:layout_width="fill_parent"
  31. android:layout_height="fill_parent"
  32. android:text="选项卡3" />
  33. </FrameLayout>
  34. </LinearLayout>
  35. </TabHost>


Android TabWidget的实现可以分为二种,一种是使用标准TabActivity实现,另外一种可以自定义方式实现,这种方法实现起来相对比较复杂,但对于要实现比较多元化的view是很好的,这里我们简单看下源码

一、通用做法

继承TabActivity,实现自己的TabActivity

[java] view plaincopy
  1. import android.app.Activity;  
  2. import android.app.TabActivity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.widget.TabHost;  
  6. import android.widget.TabHost.OnTabChangeListener;  
  7. public class TabWidgetDemo2 extends TabActivity implements OnTabChangeListener {  
  8.      private TabHost mTabHost;  
  9.        
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         // TODO Auto-generated method stub  
  13.         super.onCreate(savedInstanceState);  
  14.           
  15.         setContentView(R.layout.tabwidgetdemo2);    
  16.         mTabHost = getTabHost();  
  17.         mTabHost.setOnTabChangedListener(this);  
  18.         setupTab1();  
  19.         setupTab2();  
  20.         mTabHost.setCurrentTab(1);  
  21.     }  
  22.     private void setupTab2() {  
  23.         // TODO Auto-generated method stub  
  24.         Intent intent = new Intent();  
  25.         intent.setAction(Intent.ACTION_MAIN);  
  26.         intent.setClass(this, TabWidget2.class);  
  27.         mTabHost.addTab(mTabHost.newTabSpec("TabWidget2")  
  28.                 .setIndicator("TabWidget2",getResources().getDrawable(R.drawable.icon))  
  29.                 .setContent(intent));  
  30.     }  
  31.     private void setupTab1() {  
  32.         // TODO Auto-generated method stub  
  33.         Intent intent = new Intent();  
  34.         intent.setAction(Intent.ACTION_MAIN);  
  35.         intent.setClass(this, TabWidget1.class);  
  36.         mTabHost.addTab(mTabHost.newTabSpec("TabWidget1")  
  37.                 .setIndicator("TabWidget1",getResources().getDrawable(R.drawable.icon))  
  38.                 .setContent(intent));  
  39.     }  
  40.     public void onTabChanged(String tabId) {  
  41.         // TODO Auto-generated method stub  
  42.         Activity activity = getLocalActivityManager().getActivity(tabId);  
  43.         if (activity != null) {  
  44.             activity.onWindowFocusChanged(true);  
  45.         }  
  46.     }  
  47.        
  48.        
  49. }  

二个tab对应的Activity,先看TabWidget1,这个类在第二种实现中还会用到,因此我们可以看到对Action的判断。

[java] view plaincopy
  1. import android.app.Activity;  
  2. import android.content.Intent;  
  3. import android.os.Bundle;  
  4. import com.android.exampledemo.R;  
  5. import com.android.exampledemo.util.DemoUtils;  
  6. public class TabWidget1 extends Activity {  
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         // TODO Auto-generated method stub  
  10.         super.onCreate(savedInstanceState);  
  11.           
  12.         Intent intent = this.getIntent();  
  13.         if (intent.getAction().equals(Intent.ACTION_MAIN)){  
  14.             setContentView(R.layout.tabwidgetdemo2_1);  
  15.         }  
  16.         else {  
  17.             setContentView(R.layout.tabwidget_1);  
  18.             DemoUtils.updateButtonBar((Activity)this,R.id.contactstab);  
  19.         }  
  20.     }  
  21. }  

 

再看一下TabWidget2,这个Activity我们在第二种实现方式中也会用到。

[java] view plaincopy
  1. import com.android.exampledemo.R;  
  2. import com.android.exampledemo.util.DemoUtils;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. public class TabWidget2 extends Activity {  
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         // TODO Auto-generated method stub  
  10.         super.onCreate(savedInstanceState);  
  11.           
  12.         Intent intent = this.getIntent();  
  13.           
  14.         if (intent.getAction().equals(Intent.ACTION_MAIN)){  
  15.             setContentView(R.layout.tabwidgetdemo2_1);  
  16.         }  
  17.         else {  
  18.             setContentView(R.layout.tabwidget_2);  
  19.             DemoUtils.updateButtonBar((Activity)this,R.id.groupstab);  
  20.         }  
  21.     }  
  22. }  

 

最后就是各个Activity对应的layout

1.tabwidgetdemo2.xml

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TabHost  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:id="@android:id/tabhost"  
  5.   android:layout_width="fill_parent"  
  6.   android:layout_height="fill_parent">  
  7.   <LinearLayout   
  8.     android:orientation="vertical"  
  9.     android:layout_width="fill_parent"  
  10.     android:layout_height="fill_parent">  
  11.     <TabWidget android:id="@android:id/tabs"  
  12.         android:layout_width="fill_parent"  
  13.         android:layout_height="68dip"  
  14.         android:paddingLeft="1dip"  
  15.         android:paddingRight="1dip"  
  16.         android:paddingTop="4dip"  
  17.         />  
  18.     <FrameLayout android:id="@android:id/tabcontent"  
  19.         android:layout_width="fill_parent"  
  20.         android:layout_height="0dip"  
  21.         android:layout_weight="1"  
  22.         />  
  23.     </LinearLayout>   
  24. </TabHost>  

2.二个sub tab对应的layout

[xhtml] view plaincopy
  1. Layout1  
  2. <?xml version="1.0" encoding="utf-8"?>  
  3. <LinearLayout  
  4.   xmlns:android="http://schemas.android.com/apk/res/android"  
  5.   android:layout_width="fill_parent"  
  6.   android:layout_height="fill_parent"  
  7.   android:background="#FFF">  
  8.   <TextView android:id="@+id/textview"   
  9.     android:layout_width="wrap_content"   
  10.     android:layout_height="wrap_content"  
  11.     android:text="Tab Widget first">  
  12.    </TextView>  
  13. </LinearLayout>  
  14. Layout2  
  15. <?xml version="1.0" encoding="utf-8"?>  
  16. <LinearLayout  
  17.   xmlns:android="http://schemas.android.com/apk/res/android"  
  18.   android:layout_width="fill_parent"  
  19.   android:layout_height="fill_parent"  
  20.   android:background="#FFF">  
  21.   <TextView android:id="@+id/textview"   
  22.     android:layout_width="wrap_content"   
  23.     android:layout_height="wrap_content"  
  24.     android:text="Tab Widget second">  
  25.    </TextView>  
  26. </LinearLayout>  

 

 

方法2:

先创建一个Activity (TabWidgetDemo)

[c-sharp] view plaincopy
  1. 1.TabWidgetDemo.java  
  2. import com.android.exampledemo.R;  
  3. import com.android.exampledemo.util.DemoUtils;  
  4. import android.app.Activity;  
  5. import android.content.Context;  
  6. import android.content.SharedPreferences;  
  7. import android.os.Bundle;  
  8. //not use tabhost to organized   
  9. public class TabWidgetDemo extends Activity {  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         // TODO Auto-generated method stub  
  13.         super.onCreate(savedInstanceState);  
  14.         //int activeTab = DemoUtils.getIntPref(this, "activetab", R.id.artisttab);  
  15.         SharedPreferences prefs =  
  16.             getSharedPreferences(getPackageName(), Context.MODE_PRIVATE);  
  17.         int activeTab = prefs.getInt("activetab", R.id.contactstab);  
  18.         if (activeTab != R.id.contactstab  
  19.                 && activeTab != R.id.groupstab) {  
  20.             activeTab = R.id.contactstab;  
  21.         }  
  22.         DemoUtils.activateTab(this, activeTab);  
  23.     }  
  24. }  
  25. 2.DemoUtils  
  26. import android.app.Activity;  
  27. import android.content.Intent;  
  28. import android.net.Uri;  
  29. import android.view.View;  
  30. import android.widget.TabWidget;  
  31. import com.android.exampledemo.R;  
  32. public class DemoUtils {  
  33.     static int sActiveTabIndex = -1;  
  34.       
  35.     public static void activateTab(Activity a,int active_id){  
  36.         Intent intent = new Intent(Intent.ACTION_PICK);  
  37.         switch (active_id) {  
  38.         case R.id.contactstab:  
  39.             intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/tb_contacts");  
  40.             break;  
  41.         case R.id.groupstab:  
  42.             intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/tb_groups");  
  43.             break;  
  44.         default:  
  45.             return;  
  46.         }  
  47.         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  48.         a.startActivity(intent);  
  49.         a.finish();  
  50.         a.overridePendingTransition(0,0);  
  51.     }  
  52.       
  53.       
  54.     public static void updateButtonBar(Activity a, int highlight) {  
  55.         final TabWidget ll = (TabWidget) a.findViewById(R.id.buttonbar);  
  56.           
  57.          for (int i = ll.getChildCount() - 1; i >= 0; i--) {  
  58.              View v = ll.getChildAt(i);  
  59.              boolean isActive = (v.getId() == highlight);  
  60.              if (isActive) {  
  61.                     ll.setCurrentTab(i);  
  62.                     sActiveTabIndex = i;  
  63.              }  
  64.                
  65.              v.setTag(i);  
  66.              v.setOnClickListener(new View.OnClickListener() {  
  67.                     public void onClick(View v) {  
  68.                         int id = v.getId();  
  69.                         if (id == ll.getChildAt(sActiveTabIndex).getId()) {  
  70.                             return;  
  71.                         }  
  72.                         activateTab((Activity)ll.getContext(),id );  
  73.                         ll.setCurrentTab((Integer) v.getTag());  
  74.                     }});  
  75.          }  
  76.     }  
  77. }  

 

 

二个Tab sub activity前一方法中已经给出,这里我们只需要看一下layout的实现就可以了

1>buttonbar.xml

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TabWidget xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/buttonbar"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="wrap_content" >  
  6.     <TextView  
  7.         android:id="@+id/contactstab"  
  8.         android:focusable="true"  
  9.         android:drawableTop="@drawable/icon"  
  10.         android:background="@drawable/buttonbarbackground"  
  11.         android:text="Contacts"  
  12.         android:textColor="@color/tab_indicator_text"  
  13.         android:textAppearance="?android:attr/textAppearanceSmall"  
  14.         android:paddingTop="7dip"  
  15.         android:paddingBottom="2dip"  
  16.         android:gravity="center"  
  17.         android:layout_weight="1"  
  18.         android:layout_marginLeft="-3dip"  
  19.         android:layout_marginRight="-3dip"  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="84dip"  
  22.         android:singleLine="true"  
  23.         android:ellipsize="marquee" />  
  24.     <TextView  
  25.         android:id="@+id/groupstab"  
  26.         android:focusable="true"  
  27.         android:drawableTop="@drawable/icon"  
  28.         android:background="@drawable/buttonbarbackground"  
  29.         android:text="Group"  
  30.         android:textColor="@color/tab_indicator_text"  
  31.         android:textAppearance="?android:attr/textAppearanceSmall"  
  32.         android:paddingTop="7dip"  
  33.         android:paddingBottom="2dip"  
  34.         android:gravity="center"  
  35.         android:layout_weight="1"  
  36.         android:layout_marginLeft="-3dip"  
  37.         android:layout_marginRight="-3dip"  
  38.         android:layout_width="match_parent"  
  39.         android:layout_height="84dip"  
  40.         android:singleLine="true"  
  41.         android:ellipsize="marquee" />  
  42. </TabWidget>  

2>tabwidget_1.xml

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent">  
  6.     
  7.   <include layout="@layout/battonbar" />  
  8.     
  9.   <ExpandableListView android:id="@+id/android:list"  
  10.                   android:layout_width="fill_parent"   
  11.                   android:layout_height="wrap_content"  
  12.                   android:footerDividersEnabled="true"  
  13.                   android:fadeScrollbars="true"  
  14.                   android:drawSelectorOnTop="true">  
  15.   </ExpandableListView>  
  16.     
  17. </LinearLayout>  

3> tabwidget_2.xml

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent">  
  6.     
  7.   <include layout="@layout/battonbar" />  
  8.     
  9. </LinearLayout>  

 

Android TabWidget相关推荐

  1. 分享android开发过程中用到的一些开源框架

    在目前软件开发行业中,流行着这么一句话"天下武功,唯快不破".而"快",就不能让我们重复去制造论坛,不能去重新发明轮子.目前开源界中已经有很多成熟的,得到了大量 ...

  2. 实现、设置-Android TabWidget-by小雨

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 首先先看一个小例子,接着讲授理原 TabTest.java view plaincopy t ...

  3. Android入门之TabHost,TabWidget

    为什么80%的码农都做不了架构师?>>>    这回要介绍的是Android的Tab控件,Tab控件可以达到分页的效果,让一个屏幕的内容尽量丰富,当然也会增加开发的复杂程度,在有必要 ...

  4. Android之玩转选项卡(TabHost、TabWidget、FrameLayout)

    选项卡(TabHost.TabWidget.FrameLayout) 选项卡由TabHost.TabWidget.FrameLayout 这3个组件构成,用于实现一个多标签页的用户界面,不费话了,先爆 ...

  5. android getdecorview 出现空指针,android – 为什么我从TabWidget得到一个空指针异常?...

    我正在编写一个android程序,其中我有一个使用制表符的活动. 活动 public class UnitActivity extends TabActivity { @Override public ...

  6. Android 切换卡(TabWidget)

           TabWidget类似于Android 中查看电话薄的界面,通过多个标签切换显示不同内容.要实现这一效果,首先要了解TabHost,它是一个用来存放多个Tab标签的容器.每一个Tab都可 ...

  7. android标签切换卡,Android切换卡TabWidget用法示例

    本文实例讲述了Android切换卡TabWidget用法.分享给大家供大家参考,具体如下: Tab选项卡类似与电话本的界面,通过多个标签切换不同的内容,要实现这个效果,首先要知道TabHost,它是一 ...

  8. android中tabview去掉下划线,TabWidget去除底部下划线

    采用TabHost布局时,往往会发现默认的系统风格与软件风格很不协调,比如TabWidget的下划线影响布局效果.通常情况下会去除其下划线.如果是采用xml布局文件,在TabWidget的属性项设置a ...

  9. android 标签样式布局,安卓 Tab 标签-利用 TabHost、TabWidget、FrameLayout 啰里八嗦实现 Tab 标签控件...

    安卓 Tab 标签-利用 TabHost.TabWidget.FrameLayout 啰里八嗦实现 Tab 标签控件 首先 XML 布局代码 TabHost 是整个 Tab 的外围,TabWidget ...

最新文章

  1. re:Invent第二天:互联网客户在右传统客户在左,AWS向哪儿?
  2. Cpp 对象模型探索 / operator new、operator delete、operator new[] 和 operator delete [] 重载
  3. node php聊天室,最简单的Nodejs聊天室示例
  4. Android仿美团加载数据、小人奔跑进度动画对话框(附顺丰快递员奔跑效果)
  5. 没有钱的苦恼与无奈:七个城市的1000元生活(转载)
  6. ESP8266 教程2 — 烧录AT固件
  7. 现场直击 | 复旦MBA科创青干营开营
  8. 微信小程序开发常用方法
  9. 安卓镜像刻录软件_手机iso刻录工具去广告版下载-安卓手机版iso刻录工具无广告版(iso写盘工具)v3.4 2020最新版_新绿资源网...
  10. 大数据Flink(八):Flink入门案例
  11. eclipse debug 多线程
  12. 带你深度解析断点续传原理并案例Http1.1协议
  13. mtk平台gsensor,msensor方向确定方法
  14. Vue开发仿京东商场app
  15. IOTOS物联中台从0到1开发modbus_rtu驱动 实例详解
  16. 内网主机通过公网域名解析访问内网服务器,存在什么问题,如何解决?
  17. C语言——矩阵计算(转置、加法、减法、数乘、乘法)
  18. ORDER: OpenWorld Object Detection on Road Scenes
  19. comsol-添加线圈几何分析
  20. C盘被$ESTBAK$占用100G

热门文章

  1. iOS开发 - 获取时间段
  2. DOMINO的JDBC和ODBC连接方法
  3. Python常用内置函数(二)
  4. 基于PowerShell 3.0的web接口测试
  5. C++中虚函数与多态实现
  6. linux 下批量修改文件的编码
  7. [置顶] 归并排序,逆序数
  8. SQLSERVER DISTINCT的反例
  9. 拼多多季报图解:营收34亿 活跃买家数同比增长144%
  10. Bmob图片上传遇到的坑