在Android应用中,经常会用到TabHost选项卡,可以方便地在不同页面间切换。之前看过网上的一些教程,但大多都是一个形式,看得迷迷糊糊,不能让人很好的理解和学习。所以,在此详细地列出了Tab与TabHost的使用方法,有不妥之处,尽请指正!
首先,创建一个选项卡界面,需要使用一个TabHost和TabWidget。这个TabHost必须是根节点的布局,也就是main.xml。其中同时包含TabWidget显示标签和一个FrameLayout显示选项卡的内容。如图:
接下来就可以布局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就讲解到这。欢迎感兴趣的朋友在此探讨。