Chinaunix首页 | 论坛 | 博客
  • 博客访问: 292901
  • 博文数量: 68
  • 博客积分: 1474
  • 博客等级: 上尉
  • 技术积分: 616
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-12 12:07
文章分类

全部博文(68)

文章存档

2011年(68)

分类: 嵌入式

2011-02-16 17:58:19

Tab与TabHost
盛放Tab的容器是TabHost
如何实现??
每一个Tab还对应了一个布局,这个就有点好玩了。一个Activity,对应了多个功能布局。
①新建一个Tab项目,注意,不要生成main Activity
②在包里面新建一个类MyTab,继承于TabActivity
其实,TabActivity是Activity的子类
  1. 1. package zyf.tab.test;
  2.    2.
  3.    3. import android.app.TabActivity;
  4.    4.
  5.    5. public class MyTab extends TabActivity {
  6.    6.
  7.    7. }

③从父类继承OnCreate()入口方法
  1. 1. package zyf.tab.test;
  2.    2. import android.app.TabActivity;
  3.    3. import android.os.Bundle;
  4.    4. public class MyTab extends TabActivity {
  5.    5. @Override
  6.    6. protected void onCreate(Bundle savedInstanceState) {
  7.    7. // TODO Auto-generated method stub

  8.    8. super.onCreate(savedInstanceState);
  9.    9. }
  10.   10. }

④在Manifest.xml文件中注册一下MyTab类(Activity)
  1. 1. <activity android:name=".MyTab">
  2.    2. <intent-filter>
  3.    3. <action android:name="android.intent.action.MAIN"></action>
  4.    4. <category android:name="android.intent.category.LAUNCHER"></category>
  5.    5. </intent-filter>
  6.    6. </activity>

⑤这时候,需要设计一下标签页对应的布局,一般采用FrameLayout作为根布局,每个标签页面对应一个子节点的Layout
  1. 1. <?xml version="1.0" encoding="utf-8"?>
  2.    2. <!-- 这里是根节点布局 -- >
  3.    3. <FrameLayout xmlns:android=""
  4.    4. android:layout_width="fill_parent" android:layout_height="fill_parent">
  5.    5.
  6.    6. <!-- 第一个Tab 对应的布局 -- >
  7.    7. <LinearLayout android:id="@+id/widget_layout_Blue"
  8.    8. android:layout_width="fill_parent" android:layout_height="fill_parent"
  9.    9. androidrientation="vertical" >
  10.   10. <EditText android:id="@+id/widget34" android:layout_width="fill_parent"
  11.   11. android:layout_height="wrap_content" android:text="EditText"
  12.   12. android:textSize="18sp">
  13.   13. </EditText>
  14.   14. <Button android:id="@+id/widget30" android:layout_width="wrap_content"
  15.   15. android:layout_height="wrap_content" android:text="Button">
  16.   16. </Button>
  17.   17. </LinearLayout>
  18.   18. <!-- 第二个Tab 对应的布局 -- >
  19.   19. <LinearLayout android:id="@+id/widget_layout_red"
  20.   20. android:layout_width="fill_parent" android:layout_height="fill_parent"
  21.   21. androidrientation="vertical" >
  22.   22. <AnalogClock android:id="@+id/widget36"
  23.   23. android:layout_width="wrap_content" android:layout_height="wrap_content">
  24.   24. </AnalogClock>
  25.   25. </LinearLayout>
  26.   26. <!-- 第三个Tab 对应的布局 -- >
  27.   27. <LinearLayout android:id="@+id/widget_layout_green"
  28.   28. android:layout_width="fill_parent" android:layout_height="fill_parent"
  29.   29. androidrientation="vertical">
  30.   30. <RadioGroup android:id="@+id/widget43"
  31.   31. android:layout_width="166px" android:layout_height="98px"
  32.   32. androidrientation="vertical">
  33.   33. <RadioButton android:id="@+id/widget44"
  34.   34. android:layout_width="wrap_content" android:layout_height="wrap_content"
  35.   35. android:text="RadioButton">
  36.   36. </RadioButton>
  37.   37. <RadioButton android:id="@+id/widget45"
  38.   38. android:layout_width="wrap_content" android:layout_height="wrap_content"
  39.   39. android:text="RadioButton">
  40.   40. </RadioButton>
  41.   41. </RadioGroup>
  42.   42. </LinearLayout>
  43.   43. </FrameLayout>

⑥首先,应该声明TabHost,然后用LayoutInflater过滤出布局来,给TabHost加上含有Tab页面的FrameLayout
  1. 1. private TabHost myTabhost;
  2.    2. myTabhost=this.getTabHost();//从TabActivity上面获取放置Tab的TabHost

  3.    3. LayoutInflater.from(this).inflate(R.layout.main, myTabhost.getTabContentView(), true);
  4.    4. //from(this)从这个TabActivity获取LayoutInflater

  5.    5. //R.layout.main 存放Tab布局

  6.    6. //通过TabHost获得存放Tab标签页内容的FrameLayout

  7.    7. //是否将inflate 拴系到根布局元素上

  8.    8. myTabhost.setBackgroundColor(Color.argb(150, 22, 70, 150));
  9.    9.

⑦接着,在TabHost创建一个标签,然后设置一下标题/图标/标签页布局
  1. 1. myTabhost
  2.    2. .addTab(myTabhost.newTabSpec("TT")// 制造一个新的标签TT

  3.    3. .setIndicator("KK",
  4.    4. getResources().getDrawable(R.drawable.ajjc))
  5.    5. // 设置一下显示的标题为KK,设置一下标签图标为ajjc

  6.    6. .setContent(R.id.widget_layout_red));
  7.    7.

⑧标签切换事件处理,setOnTabChangedListener
  1. 1. myTabhost.setOnTabChangedListener(new OnTabChangeListener(){
  2.    2. @Override
  3.    3. public void onTabChanged(String tabId) {
  4.    4. // TODO Auto-generated method stub

  5.    5. }
  6.    6. });

⑨各个标签页的动态MENU
先把在XML中设计好的MENU放到一个int数组里
  1. 1. private static final int myMenuResources[] = { R.menu.phonebook_menu,
  2.    2. R.menu.addphone_menu, R.menu.chatting_menu, R.menu.userapp_menu };

在setOnTabChangedListener()方法中根据标签的切换情况来设置myMenuSettingTag
  1. 1. @Override
  2.    2. public void onTabChanged(String tagString) {
  3.    3. // TODO Auto-generated method stub

  4.    4. if (tagString.equals("One")) {
  5.    5. myMenuSettingTag = 1;
  6.    6. }
  7.    7. if (tagString.equals("Two")) {
  8.    8. myMenuSettingTag = 2;
  9.    9. }
  10.   10. if (tagString.equals("Three")) {
  11.   11. myMenuSettingTag = 3;
  12.   12. }
  13.   13. if (tagString.equals("Four")) {
  14.   14. myMenuSettingTag = 4;
  15.   15. }
  16.   16. if (myMenu != null) {
  17.   17. onCreateOptionsMenu(myMenu);
  18.   18. }
  19.   19. }

然后onCreateOptionsMenu(Menu menu) 方法中通过MenuInflater过滤器动态加入MENU
  1. 1. @Override
  2.    2. public boolean onCreateOptionsMenu(Menu menu) {
  3.    3. // TODO Auto-generated method stub

  4.    4. // Hold on to this

  5.    5. myMenu = menu;
  6.    6. myMenu.clear();//清空MENU菜单

  7.    7. // Inflate the currently selected menu XML resource.

  8.    8. MenuInflater inflater = getMenuInflater();
  9.    9. //从TabActivity这里获取一个MENU过滤器

  10.   10. switch (myMenuSettingTag) {
  11.   11. case 1:
  12.   12. inflater.inflate(myMenuResources[0], menu);
  13.   13. //动态加入数组中对应的XML MENU菜单

  14.   14. break;
  15.   15. case 2:
  16.   16. inflater.inflate(myMenuResources[1], menu);
  17.   17. break;
  18.   18. case 3:
  19.   19. inflater.inflate(myMenuResources[2], menu);
  20.   20. break;
  21.   21. case 4:
  22.   22. inflater.inflate(myMenuResources[3], menu);
  23.   23. break;
  24.   24. default:
  25.   25. break;
  26.   26. }
  27.   27. return super.onCreateOptionsMenu(menu);
  28.   28. }

⑩运行效果

阅读(3222) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~