【Android 界面效果22】Android的Tab与TabHost

时间:2023-03-09 06:58:00
【Android 界面效果22】Android的Tab与TabHost
Tab与TabHost
【Android 界面效果22】Android的Tab与TabHost

这就是Tab,而盛放Tab的容器就是TabHost
如何实现??
每一个Tab还对应了一个布局,这个就有点好玩了。一个Activity,对应了多个功能布局。
①新建一个Tab项目,注意,不要生成main Activity

【Android 界面效果22】Android的Tab与TabHost

这里不要选
②在包里面新建一个类MyTab,继承于TabActivity
其实,TabActivity是Activity的子类

  1. package zyf.tab.test;
  2. import android.app.TabActivity;
  3. public class MyTab extends TabActivity {
  4. }

复制代码

③从父类继承OnCreate()入口方法

  1. package zyf.tab.test;
  2. import android.app.TabActivity;
  3. import android.os.Bundle;
  4. public class MyTab extends TabActivity {
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. // TODO Auto-generated method stub
  8. super.onCreate(savedInstanceState);
  9. }
  10. }

复制代码

④在Manifest.xml文件中注册一下MyTab类(Activity)

  1. <activity android:name=".MyTab">
  2. <intent-filter>
  3. <action android:name="android.intent.action.MAIN"></action>
  4. <category android:name="android.intent.category.LAUNCHER"></category>
  5. </intent-filter>
  6. </activity>

复制代码

⑤这时候,需要设计一下标签页对应的布局,一般采用FrameLayout作为根布局,每个标签页面对应一个子节点的Layout

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--  这里是根节点布局  -- >
  3. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent" android:layout_height="fill_parent">
  5. <!--  第一个Tab 对应的布局  -- >
  6. <LinearLayout android:id="@+id/widget_layout_Blue"
  7. android:layout_width="fill_parent" android:layout_height="fill_parent"
  8. androidrientation="vertical" >
  9. <EditText android:id="@+id/widget34" android:layout_width="fill_parent"
  10. android:layout_height="wrap_content" android:text="EditText"
  11. android:textSize="18sp">
  12. </EditText>
  13. <Button android:id="@+id/widget30" android:layout_width="wrap_content"
  14. android:layout_height="wrap_content" android:text="Button">
  15. </Button>
  16. </LinearLayout>
  17. <!--  第二个Tab 对应的布局  -- >
  18. <LinearLayout android:id="@+id/widget_layout_red"
  19. android:layout_width="fill_parent" android:layout_height="fill_parent"
  20. androidrientation="vertical"  >
  21. <AnalogClock android:id="@+id/widget36"
  22. android:layout_width="wrap_content" android:layout_height="wrap_content">
  23. </AnalogClock>
  24. </LinearLayout>
  25. <!--  第三个Tab 对应的布局  -- >
  26. <LinearLayout android:id="@+id/widget_layout_green"
  27. android:layout_width="fill_parent" android:layout_height="fill_parent"
  28. androidrientation="vertical">
  29. <RadioGroup android:id="@+id/widget43"
  30. android:layout_width="166px" android:layout_height="98px"
  31. androidrientation="vertical">
  32. <RadioButton android:id="@+id/widget44"
  33. android:layout_width="wrap_content" android:layout_height="wrap_content"
  34. android:text="RadioButton">
  35. </RadioButton>
  36. <RadioButton android:id="@+id/widget45"
  37. android:layout_width="wrap_content" android:layout_height="wrap_content"
  38. android:text="RadioButton">
  39. </RadioButton>
  40. </RadioGroup>
  41. </LinearLayout>
  42. </FrameLayout>

复制代码

⑥首先,应该声明TabHost,然后用LayoutInflater过滤出布局来,给TabHost加上含有Tab页面的FrameLayout

  1. private TabHost myTabhost;
  2. myTabhost=this.getTabHost();//从TabActivity上面获取放置Tab的TabHost
  3. LayoutInflater.from(this).inflate(R.layout.main, myTabhost.getTabContentView(), true);
  4. //from(this)从这个TabActivity获取LayoutInflater
  5. //R.layout.main 存放Tab布局
  6. //通过TabHost获得存放Tab标签页内容的FrameLayout
  7. //是否将inflate 拴系到根布局元素上
  8. myTabhost.setBackgroundColor(Color.argb(150, 22, 70, 150));
  9. //设置一下TabHost的颜色

复制代码

⑦接着,在TabHost创建一个标签,然后设置一下标题/图标/标签页布局

  1. myTabhost
  2. .addTab(myTabhost.newTabSpec("TT")// 制造一个新的标签TT
  3. .setIndicator("KK",
  4. getResources().getDrawable(R.drawable.ajjc))
  5. // 设置一下显示的标题为KK,设置一下标签图标为ajjc
  6. .setContent(R.id.widget_layout_red));
  7. //设置一下该标签页的布局内容为R.id.widget_layout_red,这是FrameLayout中的一个子Layout

复制代码

⑧标签切换事件处理,setOnTabChangedListener

  1. myTabhost.setOnTabChangedListener(new OnTabChangeListener(){
  2. @Override
  3. public void onTabChanged(String tabId) {
  4. // TODO Auto-generated method stub
  5. }
  6. });

复制代码

⑨各个标签页的动态MENU
先把在XML中设计好的MENU放到一个int数组里

  1. private static final int myMenuResources[] = { R.menu.phonebook_menu,
  2. R.menu.addphone_menu, R.menu.chatting_menu, R.menu.userapp_menu };

复制代码

在setOnTabChangedListener()方法中根据标签的切换情况来设置myMenuSettingTag

  1. @Override
  2. public void onTabChanged(String tagString) {
  3. // TODO Auto-generated method stub
  4. if (tagString.equals("One")) {
  5. myMenuSettingTag = 1;
  6. }
  7. if (tagString.equals("Two")) {
  8. myMenuSettingTag = 2;
  9. }
  10. if (tagString.equals("Three")) {
  11. myMenuSettingTag = 3;
  12. }
  13. if (tagString.equals("Four")) {
  14. myMenuSettingTag = 4;
  15. }
  16. if (myMenu != null) {
  17. onCreateOptionsMenu(myMenu);
  18. }
  19. }

复制代码

然后onCreateOptionsMenu(Menu menu) 方法中通过MenuInflater过滤器动态加入MENU

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. // TODO Auto-generated method stub
  4. // Hold on to this
  5. myMenu = menu;
  6. myMenu.clear();//清空MENU菜单
  7. // Inflate the currently selected menu XML resource.
  8. MenuInflater inflater = getMenuInflater();
  9. //从TabActivity这里获取一个MENU过滤器
  10. switch (myMenuSettingTag) {
  11. case 1:
  12. inflater.inflate(myMenuResources[0], menu);
  13. //动态加入数组中对应的XML MENU菜单
  14. break;
  15. case 2:
  16. inflater.inflate(myMenuResources[1], menu);
  17. break;
  18. case 3:
  19. inflater.inflate(myMenuResources[2], menu);
  20. break;
  21. case 4:
  22. inflater.inflate(myMenuResources[3], menu);
  23. break;
  24. default:
  25. break;
  26. }
  27. return super.onCreateOptionsMenu(menu);
  28. }

复制代码

⑩运行效果

【Android 界面效果22】Android的Tab与TabHost
【Android 界面效果22】Android的Tab与TabHost
【Android 界面效果22】Android的Tab与TabHost