Android TabWidget的实现可以分为二种,一种是使用标准TabActivity实现,另外一种可以自定义方式实现,这种方法实现起来相对比较复杂,但对于要实现比较多元化的view是很好的,这里我们简单看下源码
一、通用做法
继承TabActivity,实现自己的TabActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tabwidgetdemo2);
mTabHost = getTabHost();
mTabHost.setOnTabChangedListener(this);
setupTab1();
setupTab2();
mTabHost.setCurrentTab(1);
}
private void setupTab2() {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.setClass(this, TabWidget2.class);
mTabHost.addTab(mTabHost.newTabSpec("TabWidget2")
.setIndicator("TabWidget2",getResources().getDrawable(R.drawable.icon))
.setContent(intent));
}
private void setupTab1() {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.setClass(this, TabWidget1.class);
mTabHost.addTab(mTabHost.newTabSpec("TabWidget1")
.setIndicator("TabWidget1",getResources().getDrawable(R.drawable.icon))
.setContent(intent));
}
public void onTabChanged(String tabId) {
// TODO Auto-generated method stub
Activity activity = getLocalActivityManager().getActivity(tabId);
if (activity != null) {
activity.onWindowFocusChanged(true);
}
}
}
二个tab对应的Activity,先看TabWidget1,这个类在第二种实现中还会用到,因此我们可以看到对Action的判断。
Intent intent = this.getIntent();
if (intent.getAction().equals(Intent.ACTION_MAIN)){
setContentView(R.layout.tabwidgetdemo2_1);
}
else {
setContentView(R.layout.tabwidget_1);
DemoUtils.updateButtonBar((Activity)this,R.id.contactstab);
}
}
}
再看一下TabWidget2,这个Activity我们在第二种实现方式中也会用到。
Intent intent = this.getIntent();
if (intent.getAction().equals(Intent.ACTION_MAIN)){
setContentView(R.layout.tabwidgetdemo2_1);
}
else {
setContentView(R.layout.tabwidget_2);
DemoUtils.updateButtonBar((Activity)this,R.id.groupstab);
}
}
}
最后就是各个Activity对应的layout
1.tabwidgetdemo2.xml
2.二个sub tab对应的layout
方法2:
先创建一个Activity (TabWidgetDemo)
public static void activateTab(Activity a,int active_id){
Intent intent = new Intent(Intent.ACTION_PICK);
switch (active_id) {
case R.id.contactstab:
intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/tb_contacts");
break;
case R.id.groupstab:
intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/tb_groups");
break;
default:
return;
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
a.startActivity(intent);
a.finish();
a.overridePendingTransition(0,0);
}
public static void updateButtonBar(Activity a, int highlight) {
final TabWidget ll = (TabWidget) a.findViewById(R.id.buttonbar);
for (int i = ll.getChildCount() - 1; i >= 0; i--) {
View v = ll.getChildAt(i);
boolean isActive = (v.getId() == highlight);
if (isActive) {
ll.setCurrentTab(i);
sActiveTabIndex = i;
}
v.setTag(i);
v.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int id = v.getId();
if (id == ll.getChildAt(sActiveTabIndex).getId()) {
return;
}
activateTab((Activity)ll.getContext(),id );
ll.setCurrentTab((Integer) v.getTag());
}});
}
}
}
二个Tab sub activity前一方法中已经给出,这里我们只需要看一下layout的实现就可以了
1>buttonbar.xml
2>tabwidget_1.xml
<include layout="@layout/battonbar" />
<ExpandableListView android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:footerDividersEnabled="true"
android:fadeScrollbars="true"
android:drawSelectorOnTop="true">
</ExpandableListView>
</LinearLayout>
3> tabwidget_2.xml
<include layout="@layout/battonbar" />
</LinearLayout>
另外一些资源文件我就不提供了,上面二种方式都可以实现Tabwidget,第一种方法比较通用,第二种可以自定义一些样式,可以做一些比较复杂的View,希望对大家有所帮助!