Android的Tab与TabHost讲解

  在Android应用中,经常会用到TabHost选项卡,可以方便地在不同页面间切换。之前看过网上的一些教程,但大多都是一个形式,看得迷迷糊糊,不能让人很好的理解和学习。所以,在此详细地列出了Tab与TabHost的使用方法,有不妥之处,尽请指正!

  首先,创建一个选项卡界面,需要使用一个TabHost和TabWidget。这个TabHost必须是根节点的布局,也就是main.xml。其中同时包含TabWidget显示标签和一个FrameLayout显示选项卡的内容。如图:

Android的Tab与TabHost讲解_第1张图片

接下来就可以布局Tab选项卡面板了,常用的方法有三种:

(一)从一个layout布局创建各个tab页内容

public class Tabs1 extends TabActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TabHost tabHost = getTabHost();//获得一个TabHost。
        
        LayoutInflater.from(this).inflate(R.layout.tabs1, tabHost.getTabContentView(), true);
        tabHost.addTab(tabHost.newTabSpec("tab1")
                .setIndicator("tab1")
                .setContent(R.id.view1));
        tabHost.addTab(tabHost.newTabSpec("tab3")
                .setIndicator("tab2")
                .setContent(R.id.view2));
        tabHost.addTab(tabHost.newTabSpec("tab3")
                .setIndicator("tab3")
                .setContent(R.id.view3));
    }
}

也就是说,选项卡里的内容是基于layout布局的,我们可以使用自己建立的布局文件来显示内容。当然,这种方法不常用,因为我们不会为了建立选项卡来单独显示内容,而不能做其他的事。

(二)动态创建一个view来做为tab页的内容

public class Tabs2 extends TabActivity implements TabHost.TabContentFactory {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final TabHost tabHost = getTabHost();
        tabHost.addTab(tabHost.newTabSpec("tab1")
                .setIndicator("tab1", getResources().getDrawable(R.drawable.star_big_on))
                .setContent(this));
        tabHost.addTab(tabHost.newTabSpec("tab2")
                .setIndicator("tab2")
                .setContent(this));
        tabHost.addTab(tabHost.newTabSpec("tab3")
                .setIndicator("tab3")
                .setContent(this));
    }


    public View createTabContent(String tag) {
        final TextView tv = new TextView(this);
        tv.setText("Content for tab with tag " + tag);
        return tv;
    }
}

TabHost.TabContentFactory这个接口,是使一个选项卡的内容被选中后,使用这个我们自己创建选项卡内容的需求,即你不显示现有的视图或启动一个活动,而是我们自己动态地定义显示什么。这个接口有一个方法createTabContent(String tag)需要重写,它的作用就是用来返回选项卡被选中后显示的内容。

(三)传递一个intent以启动新的activity做为tab页的内容

这个才是我们常用的功能,可以很方便地在不同的Activity间切换,代码如下:

public class Tabs3 extends TabActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final TabHost tabHost = getTabHost();
        tabHost.addTab(tabHost.newTabSpec("tab1")
                .setIndicator("list")
                .setContent(new Intent(this, Activity_1.class)));
        tabHost.addTab(tabHost.newTabSpec("tab2")
                .setIndicator("photo list")
                .setContent(new Intent(this, Activity_2.class)));
       
        // This tab sets the intent flag so that it is recreated each time
        // the tab is clicked.
        tabHost.addTab(tabHost.newTabSpec("tab3")
                .setIndicator("destroy")
                .setContent(new Intent(this, Activity_3.class)
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
    }
}

之后,我们就可以建立响应的Activity来做指定的事情了。

这里面有几个方法需要说明一下,newTabSpec(String tag)setIndicator("destroy"),setContent(new Intent(this, Activity_3.class)。
newTabSpec(String tag)用来获得一个Tab的空间来显示Tab,
首先来看一下TabHost.TabSpac这个类,它是TabHost的子类,有如下方法:

Public Methods
String getTag()
TabHost.TabSpec setContent(int viewId)
Specify the id of the view that should be used as the content of the tab.
TabHost.TabSpec setContent( Intent  intent)
Specify an intent to use to launch an activity as the tab content.
TabHost.TabSpec setContent( TabHost.TabContentFactory  contentFactory)
Specify a   TabHost.TabContentFactory  to use to create the content of the tab.
TabHost.TabSpec setIndicator( CharSequence  label)
Specify a label as the tab indicator.
TabHost.TabSpec setIndicator( View  view)
Specify a view as the tab indicator.
TabHost.TabSpec setIndicator( CharSequence  label,   Drawable  icon)
Specify a label and icon as the tab indicator.

我们上面的程序正是使用了这里面的方法。好了,关于Tab与TabHost就讲解到这。欢迎感兴趣的朋友在此探讨。


 

你可能感兴趣的:(android,list,String,layout,Class,tabs)