TabHost的两种用法-Android学习笔记

TabHost的两种用法

在项目实践过程中要用到tabhost控件,与winform中的tabcontrol控件功能类似,但是感觉tabcontrol简单,每个tab页都可以打开页面布局相对简单一些。总结一下TabHost的两种用法,当然不仅仅只是两种用法,是目前我用到的两种方法。

1.MainActicity继承Activity

public class MainActivity extends Activity
在activity_main.xml中添加TabHost控件,如下图所示:

TabHost的两种用法-Android学习笔记_第1张图片

然后在tabcontent下的三个linearLayout中分别添加三个按钮控件。注意linearLayout中可以直接拖拽,linearLayout2和linearLayout3中,可以拖动button控件到component tree中linearLayout2和linearLayout3名字上,待红框出现时,松开鼠标这时button控件就被添加到其中了。如下图所示:

TabHost的两种用法-Android学习笔记_第2张图片

这时MainActivity的代码如下:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}
运行结果如下图所示:

TabHost的两种用法-Android学习笔记_第3张图片

然而我的tab标题都没有显示。这时因为要在java代码里边进行设置。修改后的代码如下:

public class MainActivity extends Activity {
    private TabHost myTabHost;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myTabHost=(TabHost)findViewById(R.id.tabHost);
        myTabHost.setup();

        myTabHost.addTab(myTabHost.newTabSpec("tab1").setIndicator("标签1").setContent(R.id.linearLayout));
        myTabHost.addTab(myTabHost.newTabSpec("tab2").setIndicator("标签2").setContent(R.id.linearLayout2));
        myTabHost.addTab(myTabHost.newTabSpec("tab3").setIndicator("标签3").setContent(R.id.linearLayout3));
    }
}

其中setIndicator设置的是Tab标签的名称,前面的“tab1”我理解是id吧,最后的setContent是设置内容与我们的三个linearLayout分别对应。结果如下图:

TabHost的两种用法-Android学习笔记_第4张图片

之后大家就可以在各个标签页自由发挥啦。

2.MainActivity继承TabActivity

第二种用法目的是为了可以将别的Activity作为我们的tab页的内容,因为我们可能是去改别人写的程序,而不是自己从布局开始写的。而且这样可以提高代码复用性。

然而Android Studio说他不建议用这个TabActivity所以在上面加了一横,暂且这么理解吧,不影响使用。

然后在布局中添加TabHost控件,添加按钮等等与第一种方法类似。

主程序代码:

public class MainActivity extends TabActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
然后运行,然后程序就崩了。错误贴一下:


这个错误纠结了好久一直没能改好,最后发现要去将activity_main.xml中TabHost节点的id给改掉!

原先是这:

    <TabHost
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/tabHost"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">
改成这:

    <TabHost
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@android:id/tabhost"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">
然后就能正常运行了。

下面贴一下,如何tabcontent如何关联activity,代码如下:

public class MainActivity extends TabActivity {
    private TabHost myTabHost;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myTabHost=getTabHost();
        myTabHost.addTab(myTabHost.newTabSpec("tab1").setIndicator("标签1").setContent(new Intent(this,Main2Activity.class)));
        myTabHost.addTab(myTabHost.newTabSpec("tab2").setIndicator("标签2").setContent(R.id.linearLayout2));
        myTabHost.addTab(myTabHost.newTabSpec("tab3").setIndicator("标签3").setContent(R.id.linearLayout3));

    }
}
其中“标签1"关联的是Main2Activity,其余为linearLayout。结果图如下:

TabHost的两种用法-Android学习笔记_第5张图片右图是Main2Activity的布局图TabHost的两种用法-Android学习笔记_第6张图片

总结:第一种方法基于Activity,灵活性不高,但已满足一般需求。第二种方法基于TabActivity,TabContent的内容可以关联activity,灵活方便,但是帖子:http://blog.csdn.net/wyl530274554/article/details/16331629中提到的生存周期的问题目前还没有考证。另外关于,tab标签设置图片样式以及tab标签设置高度问题读者可以自行搜索一下,资源较多。

 
 

 
 


你可能感兴趣的:(TabHost控件)