Android之TabHost 的选项卡布局
TabHost的实现有两种方式:
第一种继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost。各个Tab中的内容在布局文件中定义就行了。
第二种方式,不继承TabActivity,在布局文件中定义TabHost即可,但是TabWidget的id必须是@android:id/tabs,FrameLayout的id必须是@android:id/tabcontent。
第一种方式:
1. 布局文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <? xml version = "1.0" encoding = "utf-8" ?> <!-- Copyright 2009 Joe LaPenna --> android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:background = "@drawable/home_gradient" android:orientation = "vertical" > < TabHost android:id = "@android:id/tabhost" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > <!-- A paddingTop of zero will remove the strip below the tabs. --> < FrameLayout android:id = "@android:id/tabcontent" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:paddingBottom = "60dip" /> < RelativeLayout android:layout_width = "fill_parent" android:layout_height = "fill_parent" > <!-- android:background="#363636" --> < TabWidget android:background = "@drawable/title_bg_night" android:id = "@android:id/tabs" android:layout_width = "fill_parent" android:layout_height = "60dip" android:layout_alignParentBottom = "true" android:tabStripEnabled = "false" /> </ RelativeLayout > </ TabHost > </ LinearLayout > |
2. 继承 TabActivity
1 2 3 | public class MainTabActivity extends TabActivity { private TabHost mTabHost; private LayoutInflater inflater; |
inflater = LayoutInflater.from(this); 从这个TabActivity获取LayoutInflater
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | @Override protected void onCreate(Bundle arg0) { super .onCreate(arg0); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main_tab); inflater = LayoutInflater.from( this ); mTabHost = (TabHost) findViewById(android.R.id.tabhost); mTabHost.addTab(getTabSpec( "mydouban" , MeActivity. class , "我的豆瓣" , R.drawable.tab_main_nav_me)); mTabHost.addTab(getTabSpec( "newbook" , NewBooksActivity. class , "新书" , R.drawable.tab_main_nav_book)); mTabHost.addTab(getTabSpec( "mydouban" , MeActivity. class , "书评" , R.drawable.detail_comment_selected)); mTabHost.addTab(getTabSpec( "mydouban" , SearchActivity. class , "搜索" , R.drawable.tab_main_nav_search)); mTabHost.addTab(getTabSpec( "mydouban" , AboutActivity. class , "关于" , R.drawable.tab_main_nav_more)); } private TabSpec getTabSpec(String tag, Class clazz, String name, int drawid) { TabSpec spec = mTabHost.newTabSpec(tag); // 指定显示内容 Intent intent = new Intent( this , clazz); spec.setContent(intent); // 设置标签的样式 spec.setIndicator(getIndicatorView(name, drawid)); return spec; } // 获取view对象 private View getIndicatorView(String name, int drawid) { View view = inflater.inflate(R.layout.tab_main_nav, null ); ImageView ivicon = (ImageView) view.findViewById(R.id.ivIcon); TextView tvtitle = (TextView) view.findViewById(R.id.tvTitle); ivicon.setImageResource(drawid); tvtitle.setText(name); return view; } |
3.每个选项卡的布局文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <? xml version = "1.0" encoding = "utf-8" ?> android:id = "@+id/tabMainNav" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:background = "@drawable/tab_main_nav_selector" android:gravity = "center_horizontal" android:orientation = "vertical" > < ImageView android:id = "@+id/ivIcon" android:layout_width = "30dip" android:layout_height = "30dip" android:layout_marginBottom = "1dip" android:layout_marginTop = "5dip" android:scaleType = "fitXY" /> < TextView android:id = "@+id/tvTitle" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginBottom = "5dip" android:textAppearance = "@style/TextViewStyleTabMainNav" android:textSize = "14dip" /> </ LinearLayout > |
第二 种方式:
不继承TabActivity
继承普通Activity,<TabWidget>标签id必须为tabs、<FrameLayout>标签id必须为tabcontent.这个方式在通过findViewById获得TabHost之后,必须要调用setup方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <? xml version = "1.0" encoding = "utf-8" ?> <!-- TabHost必须包含一个 TabWidget和一个FrameLayout--> < TabHost android:id = "@+id/tabhost" android:layout_width = "fill_parent" android:layout_height = "wrap_content" > < LinearLayout android:orientation = "vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > <!-- TabWidget的id属性必须为 @android:id/tabs--> < TabWidget android:id = "@android:id/tabs" android:orientation = "horizontal" android:layout_width = "fill_parent" android:layout_height = "wrap_content" /> <!-- FrameLayout的id属性必须为 @android:id/tabcontent--> < FrameLayout android:id = "@android:id/tabcontent" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > < TextView android:id = "@+id/view1" android:layout_width = "fill_parent" android:layout_height = "fill_parent" /> < TextView android:id = "@+id/view2" android:layout_width = "fill_parent" android:layout_height = "fill_parent" /> < TextView android:id = "@+id/view3" android:layout_width = "fill_parent" android:layout_height = "fill_parent" /> </ FrameLayout > </ LinearLayout > </ TabHost > </ LinearLayout > |
// 如果没有继承TabActivity时,通过该种方法加载启动tabHost
tabHost.setup();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class TabHostTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); // 获取TabHost对象 TabHost tabHost = (TabHost) findViewById(R.id.tabhost); // 如果没有继承TabActivity时,通过该种方法加载启动tabHost tabHost.setup(); tabHost.addTab(tabHost.newTabSpec( "tab1" ).setIndicator( "第一个标签" , getResources().getDrawable(R.drawable.icon)).setContent( R.id.view1)); tabHost.addTab(tabHost.newTabSpec( "tab3" ).setIndicator( "第三个标签" ) .setContent(R.id.view3)); tabHost.addTab(tabHost.newTabSpec( "tab2" ).setIndicator( "第二个标签" ) .setContent(R.id.view2)); } } |