Tabhost嵌套以及Tab中多个Activity跳转的实现
2012-08-15 18:04
309 查看
今天明白了Tabhost嵌套和Tab里实现多个Activity的跳转原理,自己做了一个demo,先看看效果图:
![](http://my.csdn.net/uploads/201206/20/1340201503_4358.jpg)
![](http://my.csdn.net/uploads/201206/20/1340201538_2542.jpg)
![](http://my.csdn.net/uploads/201206/20/1340201577_6879.jpg)
![](http://my.csdn.net/uploads/201206/20/1340201604_5010.jpg)
源码 如下:
[java] view
plaincopy
(1) DoubleTabHost
package yy.android.tab;
import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;
public class DoubleTabHost extends TabActivity {
/* 注意:
* 对于TabHost、布局文件中必须包含
* TabHost、TabWidget 、FrameLayout
* 如果继承TabActivity,并且通过getTabHost()方法来获取TabHost
* 那么三者的ID必须是android.R.id.tabhost、android.R.id.tabs、android.R.id.tabcontent
* 如果继承Activity,可以通过findViewById来获取这三个组件,此时ID可自定义
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获得TabHost
TabHost mTabHost = getTabHost();
//新建一个tab并设置它的,Tag,标题,图标,内容
mTabHost.addTab(mTabHost.newTabSpec("YouTube").setIndicator(
"YouTube",
getResources().getDrawable(android.R.drawable.arrow_down_float)).setContent(
new Intent(this, SubTab.class)));
mTabHost.addTab(mTabHost.newTabSpec("Chrome").setIndicator(
"Chrome",
getResources().getDrawable(android.R.drawable.arrow_down_float)).setContent(
new Intent(this, YActivityGroup.class)));
mTabHost.setCurrentTab(0);//设置初始选中状态为第一个tab
}
}
//////////////////////////////////////////////////////////////////////////////////////
(2)YTabDActivity
package yy.android.tab;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
public class YTabDActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.normal);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(YTabDActivity.this, SecondActivity.class).
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//把一个Activity转换成一个View
Window w = YActivityGroup.group.getLocalActivityManager()
.startActivity("SecondActivity",intent);
View view = w.getDecorView();
//把View添加大ActivityGroup中
YActivityGroup.group.setContentView(view);
}
});
}
}
//////////////////////////////////////////////////////////////////////////////////////////
(3)YActivityGroup
package yy.android.tab;
import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
public class YActivityGroup extends ActivityGroup{
/**
* 一个静态的ActivityGroup变量,用于管理本Group中的Activity
*/
public static ActivityGroup group;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
group = this;
}
@Override//按返回键时
public void onBackPressed() {
// TODO Auto-generated method stub
//super.onBackPressed();
//把后退事件交给子Activity处理
group.getLocalActivityManager()
.getCurrentActivity().onBackPressed();
}
@Override //从新获得焦点时
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//把界面切换放到onResume方法中是因为,从其他选项卡切换回来时,
//调用搞得是onResume方法
//要跳转的界面
Intent intent = new Intent(this, YTabDActivity.class).
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//把一个Activity转换成一个View
Window w = group.getLocalActivityManager().startActivity("YTabDActivity",intent);
View view = w.getDecorView();
//把View添加大ActivityGroup中
group.setContentView(view);
}
}
////////////////////////////////////////////////////////////////////////////////
(4) SubTab
package yy.android.tab;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
public class SubTab extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.subtab);
//获得TabHost
TabHost mTabHost = (TabHost)findViewById(R.id.mytabhost);
//当时通过findViewById来获得tabhost的而不是getTabHost获得的,在添加tab之前都需要setup
mTabHost.setup();
TabWidget tabWidget = mTabHost.getTabWidget();
mTabHost.addTab(mTabHost.newTabSpec("湖人").setIndicator(
"湖人").setContent(R.id.widget59));
mTabHost.addTab(mTabHost.newTabSpec("热火").setIndicator(
"热火").setContent(R.id.widget60));
mTabHost.addTab(mTabHost.newTabSpec("雷霆").setIndicator(
"雷霆").setContent(R.id.widget60));
mTabHost.addTab(mTabHost.newTabSpec("凯尔特人").setIndicator(
"凯尔特人").setContent(R.id.widget60));
mTabHost.setCurrentTab(0);//设置初始时,第一个tab为选中状态
int height =30;
// int width =45;
//tabWidget.getChildCount()是tab个数
for (int i =0; i < tabWidget.getChildCount(); i++) {
/**设置高度、宽度,由于宽度设置为fill_parent,在此对它没效果 */
tabWidget.getChildAt(i).getLayoutParams().height = height;
// tabWidget.getChildAt(i).getLayoutParams().width = width;
/**设置tab中标题文字的颜色,不然默认为黑色 */
final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title);
tv.setTextColor(this.getResources().getColorStateList(android.R.color.white));
}
}
}
/////////////////////////////////////////////////////////////////////////////////
(5)SecondActivity
package yy.android.tab;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.group);
}
}
////////////////////////////////////////////////////////////////////////////////////////
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="yy.android.tab"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".DoubleTabHost"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".YActivityGroup"/>
<activity android:name=".YTabDActivity"/>
<activity android:name=".SubTab"/>
<activity android:name=".SecondActivity"/>
</application>
<uses-sdk android:minSdkVersion="8" />
</manifest>
//////////////////////////////////////////////////////////////////////////////////
(1)main.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ch">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_alignParentBottom="true" android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_weight="1" android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</TabHost>
////////////////////////////////////////////////////////
(2)group.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是tab的第二个界面">
</TextView>
</LinearLayout>
//////////////////////////////////////////////////////
(3)normal.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是tab的第一个界面">
</TextView>
<Button android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转 "/>
</LinearLayout>
//////////////////////////////////////////////////////
(4)subtab.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mytabhost" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/yt">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- 注意FrameLayout\TabWidget标签的位置-->
<FrameLayout android:id="@android:id/tabcontent"
android:layout_weight="1" android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/widget59"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="苹果IOS?"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
>
</TextView>
<TextView
android:id="@+id/widget60"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="谷歌Android"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
>
</TextView>
</FrameLayout>
<TabWidget android:id="@android:id/tabs"
android:layout_alignParentBottom="true" android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</TabHost>
OK,就写到这里,有什么问题可以一起讨论!!!
![](http://my.csdn.net/uploads/201206/20/1340201503_4358.jpg)
![](http://my.csdn.net/uploads/201206/20/1340201538_2542.jpg)
![](http://my.csdn.net/uploads/201206/20/1340201577_6879.jpg)
![](http://my.csdn.net/uploads/201206/20/1340201604_5010.jpg)
源码 如下:
[java] view
plaincopy
(1) DoubleTabHost
package yy.android.tab;
import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;
public class DoubleTabHost extends TabActivity {
/* 注意:
* 对于TabHost、布局文件中必须包含
* TabHost、TabWidget 、FrameLayout
* 如果继承TabActivity,并且通过getTabHost()方法来获取TabHost
* 那么三者的ID必须是android.R.id.tabhost、android.R.id.tabs、android.R.id.tabcontent
* 如果继承Activity,可以通过findViewById来获取这三个组件,此时ID可自定义
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获得TabHost
TabHost mTabHost = getTabHost();
//新建一个tab并设置它的,Tag,标题,图标,内容
mTabHost.addTab(mTabHost.newTabSpec("YouTube").setIndicator(
"YouTube",
getResources().getDrawable(android.R.drawable.arrow_down_float)).setContent(
new Intent(this, SubTab.class)));
mTabHost.addTab(mTabHost.newTabSpec("Chrome").setIndicator(
"Chrome",
getResources().getDrawable(android.R.drawable.arrow_down_float)).setContent(
new Intent(this, YActivityGroup.class)));
mTabHost.setCurrentTab(0);//设置初始选中状态为第一个tab
}
}
//////////////////////////////////////////////////////////////////////////////////////
(2)YTabDActivity
package yy.android.tab;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
public class YTabDActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.normal);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(YTabDActivity.this, SecondActivity.class).
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//把一个Activity转换成一个View
Window w = YActivityGroup.group.getLocalActivityManager()
.startActivity("SecondActivity",intent);
View view = w.getDecorView();
//把View添加大ActivityGroup中
YActivityGroup.group.setContentView(view);
}
});
}
}
//////////////////////////////////////////////////////////////////////////////////////////
(3)YActivityGroup
package yy.android.tab;
import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
public class YActivityGroup extends ActivityGroup{
/**
* 一个静态的ActivityGroup变量,用于管理本Group中的Activity
*/
public static ActivityGroup group;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
group = this;
}
@Override//按返回键时
public void onBackPressed() {
// TODO Auto-generated method stub
//super.onBackPressed();
//把后退事件交给子Activity处理
group.getLocalActivityManager()
.getCurrentActivity().onBackPressed();
}
@Override //从新获得焦点时
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//把界面切换放到onResume方法中是因为,从其他选项卡切换回来时,
//调用搞得是onResume方法
//要跳转的界面
Intent intent = new Intent(this, YTabDActivity.class).
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//把一个Activity转换成一个View
Window w = group.getLocalActivityManager().startActivity("YTabDActivity",intent);
View view = w.getDecorView();
//把View添加大ActivityGroup中
group.setContentView(view);
}
}
////////////////////////////////////////////////////////////////////////////////
(4) SubTab
package yy.android.tab;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
public class SubTab extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.subtab);
//获得TabHost
TabHost mTabHost = (TabHost)findViewById(R.id.mytabhost);
//当时通过findViewById来获得tabhost的而不是getTabHost获得的,在添加tab之前都需要setup
mTabHost.setup();
TabWidget tabWidget = mTabHost.getTabWidget();
mTabHost.addTab(mTabHost.newTabSpec("湖人").setIndicator(
"湖人").setContent(R.id.widget59));
mTabHost.addTab(mTabHost.newTabSpec("热火").setIndicator(
"热火").setContent(R.id.widget60));
mTabHost.addTab(mTabHost.newTabSpec("雷霆").setIndicator(
"雷霆").setContent(R.id.widget60));
mTabHost.addTab(mTabHost.newTabSpec("凯尔特人").setIndicator(
"凯尔特人").setContent(R.id.widget60));
mTabHost.setCurrentTab(0);//设置初始时,第一个tab为选中状态
int height =30;
// int width =45;
//tabWidget.getChildCount()是tab个数
for (int i =0; i < tabWidget.getChildCount(); i++) {
/**设置高度、宽度,由于宽度设置为fill_parent,在此对它没效果 */
tabWidget.getChildAt(i).getLayoutParams().height = height;
// tabWidget.getChildAt(i).getLayoutParams().width = width;
/**设置tab中标题文字的颜色,不然默认为黑色 */
final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title);
tv.setTextColor(this.getResources().getColorStateList(android.R.color.white));
}
}
}
/////////////////////////////////////////////////////////////////////////////////
(5)SecondActivity
package yy.android.tab;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.group);
}
}
////////////////////////////////////////////////////////////////////////////////////////
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="yy.android.tab"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".DoubleTabHost"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".YActivityGroup"/>
<activity android:name=".YTabDActivity"/>
<activity android:name=".SubTab"/>
<activity android:name=".SecondActivity"/>
</application>
<uses-sdk android:minSdkVersion="8" />
</manifest>
//////////////////////////////////////////////////////////////////////////////////
(1)main.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ch">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_alignParentBottom="true" android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_weight="1" android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</TabHost>
////////////////////////////////////////////////////////
(2)group.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是tab的第二个界面">
</TextView>
</LinearLayout>
//////////////////////////////////////////////////////
(3)normal.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是tab的第一个界面">
</TextView>
<Button android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转 "/>
</LinearLayout>
//////////////////////////////////////////////////////
(4)subtab.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mytabhost" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/yt">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- 注意FrameLayout\TabWidget标签的位置-->
<FrameLayout android:id="@android:id/tabcontent"
android:layout_weight="1" android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/widget59"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="苹果IOS?"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
>
</TextView>
<TextView
android:id="@+id/widget60"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="谷歌Android"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
>
</TextView>
</FrameLayout>
<TabWidget android:id="@android:id/tabs"
android:layout_alignParentBottom="true" android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</TabHost>
OK,就写到这里,有什么问题可以一起讨论!!!
相关文章推荐
- Tabhost嵌套以及Tab中多个Activity跳转的实现
- Tabhost嵌套以及Tab中多个Activity跳转的实现
- Tabhost嵌套以及Tab中多个Activity跳转的实现
- Activity启动模式以及实现Activity之间的跳转
- Android中不同包路径下Activity跳转的实现(解决ActivityNotFoundException)
- JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
- Kotlin 跳转Activity以及无法获取::class.java
- 【Android】使用Intent实现Activity之间的跳转(创建一个Activity的过程)
- fragment与activity及两个fragment之间的跳转实现
- Activity交互---Activity跳转(Intent实现)
- Activity间的切换实现和数据传递以及上一个Activity返回结果的获取和处理
- ViewPager实现引导界面以及进入下一个activity解决办法
- Fragment 实现android项目主流APP Tab (微博,今日头条等等),解决横竖屏切换重叠,以及切换回调。
- fragment与activity及两个fragment之间的跳转实现
- WPF 回车转Tab实现跳转
- Android tab 实现子Activity跳转
- Android入门第十五篇之ActivityGroup + GridView 实现Tab分页标签
- Android入门第十五篇之ActivityGroup + GridView 实现Tab分页标签
- 加载SDRAM以及ldr,bl实现跳转的区别
- fragment与activity之间的跳转实现