用ActivityGroup解决TabHost中多个Activity跳转问题

最近在做一个程序,刚开始没考虑全,就用TabHost做了,后来才发现程序中,需要在一个TabHost内实现多个Activity的跳转,网上搜了一翻,有人建议把TabHost改成Button,然后每个Activity中都处理加入的Button,这样是可以解决问题,但是修改起来很繁琐,所以还是继续寻找替代方法。在网上搜到了《使用ActivityGroup来切换Activity和Layout》一文,但是用在我的程序中还需要有大的改动,所以索性我就自己写了个测试例子,不错,成功了,拿出来和大家分享一下,希望对大家有帮助!

下面图片是测试程序的效果图

两个选项卡的实现

布局文件 main.xml

Xml代码

  1. <?xml
    version="1.0"
    encoding="utf-8"?>
  2. <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
    android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
  6. android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
  7. android:layout_height="fill_parent">
  8. <LinearLayout
    android:orientation="vertical"
  9. android:layout_width="fill_parent"
    android:layout_height="fill_parent">
  10. <TabWidget
    android:id="@android:id/tabs"
  11. android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
  12. <FrameLayout
    android:id="@android:id/tabcontent"
  13. android:layout_width="fill_parent"
    android:layout_height="wrap_content"
  14. android:layout_weight="3">
  15. </FrameLayout>
  16. </LinearLayout>
  17. </TabHost>
  18. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">

	<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">
		<LinearLayout android:orientation="vertical"
			android:layout_width="fill_parent" android:layout_height="fill_parent">

			<TabWidget android:id="@android:id/tabs"
				android:layout_width="fill_parent" android:layout_height="wrap_content" />
			<FrameLayout android:id="@android:id/tabcontent"
				android:layout_width="fill_parent" android:layout_height="wrap_content"
				android:layout_weight="3">

			</FrameLayout>

		</LinearLayout>
	</TabHost>

</LinearLayout>

Java代码实现 MainActivity.java

Java代码

  1. package hkp.test;
  2. import android.app.TabActivity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.widget.TabHost;
  6. public class MainActivity
    extends TabActivity {
  7. private TabHost tabHost;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. // TODO Auto-generated method stub
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. tabHost = getTabHost();
  14. tabHost.addTab(tabHost.newTabSpec("tab1")
  15. .setIndicator("First")
  16. .setContent(new Intent(this,FirstGroupTab.class)));//第一个选项卡使用一个ActivityGroup
  17. tabHost.addTab(tabHost.newTabSpec("tab2")
  18. .setIndicator("Second")
  19. .setContent(new Intent(this, SecondTab.class)));//第二个选项卡是一个Activity
  20. tabHost.setCurrentTab(0);
  21. }
  22. }
package hkp.test;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;

public class MainActivity extends TabActivity {

	private  TabHost tabHost;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		tabHost = getTabHost();

		tabHost.addTab(tabHost.newTabSpec("tab1")
				.setIndicator("First")
	        	.setContent(new Intent(this,FirstGroupTab.class)));//第一个选项卡使用一个ActivityGroup
		tabHost.addTab(tabHost.newTabSpec("tab2")
				.setIndicator("Second")
	        	.setContent(new Intent(this, SecondTab.class)));//第二个选项卡是一个Activity

		tabHost.setCurrentTab(0);
	}

}

使用 ActivityGroup的管理

Java代码

  1. package hkp.test;
  2. import android.app.ActivityGroup;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.Window;
  7. /**
  8. * @author HuangKaipeng hkp2006@gmail.com
  9. * 2011-10-5
  10. *
  11. */
  12. public class FirstGroupTab
    extends ActivityGroup {
  13. /**
  14. * 一个静态的ActivityGroup变量,用于管理本Group中的Activity
  15. */
  16. public static ActivityGroup group;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. // TODO Auto-generated method stub
  20. super.onCreate(savedInstanceState);
  21. group = this;
  22. }
  23. @Override
  24. public void onBackPressed() {
  25. // TODO Auto-generated method stub
  26. // super.onBackPressed();
  27. //把后退事件交给子Activity处理
  28. group.getLocalActivityManager()
  29. .getCurrentActivity().onBackPressed();
  30. }
  31. @Override
  32. protected void onResume() {
  33. // TODO Auto-generated method stub
  34. super.onResume();
  35. //把界面切换放到onResume方法中是因为,从其他选项卡切换回来时,
  36. //调用搞得是onResume方法
  37. //要跳转的界面
  38. Intent intent = new Intent(this, FirstActivity.class).
  39. addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  40. //把一个Activity转换成一个View
  41. Window w = group.getLocalActivityManager().startActivity("FirstActivity",intent);
  42. View view = w.getDecorView();
  43. //把View添加大ActivityGroup中
  44. group.setContentView(view);
  45. }
package hkp.test;

import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;

/**
 * @author HuangKaipeng hkp2006@gmail.com
 * 2011-10-5
 *
 */
public class FirstGroupTab 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, FirstActivity.class).
	              addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		//把一个Activity转换成一个View
		Window w = group.getLocalActivityManager().startActivity("FirstActivity",intent);
	    View view = w.getDecorView();
	    //把View添加大ActivityGroup中
	    group.setContentView(view);
	}

ActivityGroup中的第一个Activity

Java代码

  1. package hkp.test;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.Window;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. /**
  10. * @author HuangKaipeng hkp2006@gmail.com
  11. * 2011-10-5
  12. *
  13. */
  14. public class FirstActivity
    extends Activity {
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. // TODO Auto-generated method stub
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.first_activity);
  20. //跳转到第二个界面
  21. Button btn = (Button) findViewById(R.id.btn);
  22. btn.setOnClickListener(new OnClickListener() {
  23. @Override
  24. public void onClick(View v) {
  25. // TODO Auto-generated method stub
  26. Intent intent = new Intent(FirstActivity.this, SecondActivity.class).
  27. addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  28. //把一个Activity转换成一个View
  29. Window w = FirstGroupTab.group.getLocalActivityManager()
  30. .startActivity("SecondActivity",intent);
  31. View view = w.getDecorView();
  32. //把View添加大ActivityGroup中
  33. FirstGroupTab.group.setContentView(view);
  34. }
  35. });
  36. }
  37. }
package hkp.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;

/**
 * @author HuangKaipeng hkp2006@gmail.com
 * 2011-10-5
 *
 */
public class FirstActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.first_activity);

		//跳转到第二个界面
		Button btn = (Button) findViewById(R.id.btn);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(FirstActivity.this, SecondActivity.class).
			              addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				//把一个Activity转换成一个View
				Window w = FirstGroupTab.group.getLocalActivityManager()
						.startActivity("SecondActivity",intent);
			    View view = w.getDecorView();
			    //把View添加大ActivityGroup中
			    FirstGroupTab.group.setContentView(view);
			}
		});
	}

}

XML

Xml代码

  1. <?xml
    version="1.0"
    encoding="utf-8"?>
  2. <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="这个是ActivityGroup中的第一个界面!"
  11. />
  12. <Button
    android:id="@+id/btn"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:text="跳转到本组中的另一个Activity中"/>
  16. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="这个是ActivityGroup中的第一个界面!"
    />
    <Button android:id="@+id/btn"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:text="跳转到本组中的另一个Activity中"/>
</LinearLayout>
时间: 2024-09-17 04:52:54

用ActivityGroup解决TabHost中多个Activity跳转问题的相关文章

android项目出错-android项目中从一个Activity跳转到另外一个Activity发生空指针异常是什么原因造成的

问题描述 android项目中从一个Activity跳转到另外一个Activity发生空指针异常是什么原因造成的 android项目中从一个Activity跳转到另外一个Activity发生空指针异常是什么原因造成的 解决方案 具体得log信息啊.你把log 截取出来看看. 解决方案二: 你把logcat里的红字贴出来 解决方案三: 你把logcat里的红字贴出来 解决方案四: 你把logcat里的红字贴出来 解决方案五: 你把logcat里的红字贴出来

Android tab 实现子Activity跳转

http://download.csdn.net/download/fylst/3946255 项目中需要实现iphone中tabBar效果, 参考了网上大虾们的例子,实现了tab 中的子Activity跳转,并且带有动画效果:这里没有抽取动画作为参数,也可以定制自己的跳转动画:tab bar 的外观可以自己定制,将自带的tab隐藏,控制自定义的view调用tab的动作就可以,代码很简单,这里没有给出.

tabhost-如何从TabHost中引用一个子activity来调用一个公共函数?

问题描述 如何从TabHost中引用一个子activity来调用一个公共函数? 在TabHost中有两个子activity,这两个子activity在两个tab中.在其中的一个activity实现了一个公共函数,我想从父类TabHost中调用这个函数,来触发tab中的一些action.能否从TabHost中引用activity本身来调用一个公共函数?tabhost设置: res = getResources(); tabHost = getTabHost(); TabHost.TabSpec s

安卓 布局 xml 引用-急用!请问,如何解决在tabhost中每个按钮下添加子页面?

问题描述 急用!请问,如何解决在tabhost中每个按钮下添加子页面? 子页面可以加载进入,但是子页面里面的响应事件点击没有反应.而且,如果子页面里面再引用其他页面,里面的内容也显示不出来. 解决方案 http://bbs.csdn.net/topics/380075344 解决方案二: http://blog.csdn.net/harvic880925/article/details/17120325 解决方案三: Tabspec tab1tab1.setIntent() 解决方案四: Tab

tabhost-TabHost ActivityGroup里面的子Activity跳转的时候怎么修改title?

问题描述 TabHost ActivityGroup里面的子Activity跳转的时候怎么修改title? TabHost里面一个table用一个ActivityGroup,ActivityGroup里面的子Activity跳转的时候怎么修改title? 解决方案 设置无标题 然后自己在activity的布局中增加一个标题 想怎么改就怎么改 解决方案二: 哥们,别用TabHost了,改用ActionBar吧,4.0以下也可以使ActionBarSherlock开源类库,开发起来爽多了 解决方案三

Android中TabHost中实现标签的滚动以及一些TabHost开发的奇怪问题

最近在使用TabHost的时候遇到了一些奇怪的问题,在这里总结分享备忘一下. 首先说一点TabActivity将会被FragmentActivity所替代,但是本文中却是使用的TabActivity. 下面说说本程序能够实现的功能: 实现TabHost中的标题栏能够横向滚动: 自定义标题栏的大小和样式: 自定义标题栏的分割线的样式: 下面分几步来分别实现以上的功能: 第一步,先实现一个基本的TabHost的展现 详细的说明可以在网上其它地方搜的,主要就是注意一点,控件的id的是固定的不能随便更改

android用ActivityGroup实现tabhost一个tab多界面

问题描述 android用ActivityGroup实现tabhost一个tab多界面 tabhost界面 mTabHost = getTabHost(); //FileMianActivity mTabHost.addTab(mTabHost .newTabSpec(TabBindingConfig.FILE_PERSONAL) .setIndicator( TabBindingConfig.FILE_PERSONAL) .setContent(new Intent(TabActivity.t

TabHost页和子Activity之间的通讯

TabHost的各个Tab页,都是由activity组成. 现在,某个子Activity中处理数据后,要自动跳转到另外一个Tab页中.这样,需要有个TabHost页和子Activity之间的通讯的机制.   子Activity通知TabHost: 1.通过广播方式 1)在TabHost中定义广播 定义变量 protected MessageBroadcastReceiver myReceiver = null;   在onCreate中注册: 加入receiveBroadcast();   pr

android-Android中静态变量(activity的副本)内存泄露的问题

问题描述 Android中静态变量(activity的副本)内存泄露的问题 具体情境是:整个APP一步一步那样会进入多个activity,类似于注册的一个一个步骤, 由于是这样我设定每个activity跳转到另外一个的时候不finish,因为要保证可以退回到上 一步,所以我弄了每个activity里面都有一个static Activity mActivity的变量在onCreate 的时候mActivity=this,这样我就可以在一个Activity里面直接取到其他activity当前的情况,