控件TabHost的功能和web技术中的“选项卡”控件显示的效果一样。都是用最小的空间显示更多的数据。下面直接通过例子看Tabhost的用法。
示例1:通过继承TabActivity实现
布局文件:
MainActivity.java内容:
public class MainActivity extends TabActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获取TabHost的引用 TabHost tabHost = getTabHost(); //获取视图,并 LayoutInflater.from(this).inflate(R.layout.activity_main, tabHost.getTabContentView(), true); //添加Tab也的内容。 tabHost.addTab(tabHost .newTabSpec("tab1")//设置Tab页的标示 .setIndicator("导航一",//设置标题 getResources().getDrawable(R.drawable.ic_launcher))//设置标题图片,也可以不写 .setContent(R.id.tab1));//设置Tab内容 tabHost.addTab(tabHost .newTabSpec("tab2") .setIndicator("导航二", getResources().getDrawable(R.drawable.ic_launcher)) .setContent(R.id.tab2)); }}
运行结果如图:
示例2:
MainActivity.java:
public class MainActivity extends TabActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获取TabHost的引用 TabHost tabHost = getTabHost(); //为Tab添加内容 tabHost.addTab(tabHost .newTabSpec("tab1") .setIndicator("导航一", getResources().getDrawable(R.drawable.ic_launcher)) .setContent(new Intent(this, Act2.class)));//与示例1不同。这里直接添加Intent的引用 tabHost.addTab(tabHost .newTabSpec("tab2") .setIndicator("导航二", getResources().getDrawable(R.drawable.ic_launcher)) .setContent(new Intent(this, Act3.class))); }}
注:这个方法要另建两个Activity及相应的xml文件。每一个Activity既为每个Tab页的内容。在此代码就不在给出。运行结果和示例1完全相同。
示例3:自定义TabHost
main.xml:
另外还要定义一个cell.xml:
接下来是MainActivity:
public class MainActivity extends Activity { private TabWidget tabWidget; private TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取Tabhost控件 tabHost=(TabHost)findViewById(R.id.tabhost); //初始化 tabHost.setup(); //tabWidget=tabHost.getTabWidget(); //创建tab页内容 TabSpec spec1=tabHost.newTabSpec("tab1"); //通过自定义的函数创建标题。 spec1.setIndicator(CreatTabView(tabHost,"导航1",R.drawable.ic_launcher)); spec1.setContent(R.id.tab1); tabHost.addTab(spec1); TabSpec spec2=tabHost.newTabSpec("tab2"); spec2.setIndicator(CreatTabView(tabHost,"导航2",R.drawable.ic_launcher)); spec2.setContent(R.id.tab2); tabHost.addTab(spec2); TabSpec spec3=tabHost.newTabSpec("tab3"); spec3.setIndicator(CreatTabView(tabHost,"导航3",R.drawable.ic_launcher)); spec3.setContent(R.id.tab3); tabHost.addTab(spec3); /*showSpec(); tabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { showSpec(); } }); */ } /*public void showSpec() { for (int i = 0; i < tabWidget.getChildCount(); i++) { // 获得当前的视图对象 View v = tabWidget.getChildAt(i); // 判断当前点击的视图对象是否与得到的视图对象相同 if (tabHost.getCurrentTab() == i) { v.setBackgroundResource(R.drawable.ic_blue); } else { v.setBackgroundResource(R.drawable.ic_green); } } }*/ /** * 自定义tab显示样式(图片加文字) */ public View CreatTabView(TabHost tabHost,String tabtitle,int tabID){ //获取视图的引用 View tabview=LayoutInflater.from(this).inflate(R.layout.cell, null); //设置组件内容 TextView tv=(TextView)tabview.findViewById(R.id.textView1); tv.setText(tabtitle); ImageView iv=(ImageView)tabview.findViewById(R.id.p_w_picpathView1); iv.setBackgroundResource(tabID); //返回一个视图 return tabview; }}
运行结果如下图所示,点击效果不明显。明显不是我所需要的结果。将注释部分放开后,显示效果如右图,这时需要我们添加点击效果。