Tabhost中子Activity跳转到新的activity,从该activity重新返回子Activity问题解决

时间:2023-01-13 00:23:17

本人渣新才开始学android没多久,在开发中就遇到这样一个问题。Tabhost中子Activity跳转到新的activity,从该activity重新返回子Activity问题解决

问题描述:

我现在有一个MainActivity,这个activity主要就是布置了TabWidget,给里面添加了选项卡的内容。下面是添加的选项卡的代码片段。

//这只是其中的一项
tabs.addTab(tabs.newTabSpec("tab3").setIndicator("更多",getResources().getDrawable(R.drawable.tab3)).setContent(new Intent(this, MoreActivity.class)));

对于这个选项卡里的操作,我是用另一个MoreActivity实现的。(这里面其实是个GridView)
然后在这个MoreActivity里面我设置了一个注册的图标,点击这个图标就进入了RegistActivity。

现在的问题是我希望点击了RegistActivity里面的取消键就返回之前的"更多”这个标签下的样子。
但是如果我设置Intent intent = new Intent(RegistActivity.this,MainActivity.class);这样就返回到了MainActivity,而它好像默认的是第一个标签,也就是显示了第一个标签下的内容。
如果我设置Intent intent = new Intent(RegistActivity.this,MoreActivity.class);它就变成了GridView布局下的样子了,也就是底下的选项卡没了。Tabhost中子Activity跳转到新的activity,从该activity重新返回子Activity问题解决


以上就是我遇到的问题了,问题抽象描述一下就是这样:

当主Activity A是一个Tabhost布局,在子Activity B中开启一个新的Activity C,现在要从Activity C中返回,希望能返回到进入前Activity B的样子。


解决方法:

将RegistActivity(也就是C Activity)的退出函数写成如下这样:

private void exit(){
		Intent intent = new Intent(RegistActivity.this,MainActivity.class);
		RegistActivity.this.setResult(RESULT_OK, intent);    //RESULT_OK是返回状态码
		RegistActivity.this.finish();
	}

从MoreActivity(也就是B Activity)进入RegistActivity时的代码是:

Intent intent = new Intent(MoreActivity.this,
							RegistActivity.class);
					startActivityForResult(intent, 0); 
				//	MoreActivity.this.finish(); 不能finish!否则无法获得应答
在MainActivity(也就是A Activity)中添加onActivityResult方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		//这里其实可以根据状态码的不同设置显示不同的tab
		if (resultCode == RESULT_OK)
			tabs.setCurrentTab(2);
		super.onActivityResult(requestCode, resultCode, data);
	}

详解:

不知道大家看懂了木有。这里采用了应答模式进行切换,我看了这篇博,

Tabhost中子Activity使用startActivityForResult后获取不到回调值问题的解决办法

http://blog.csdn.net/ryantang03/article/details/8712233

知道了“startActivityForResult后触发的回调方法并不在Activity B中,而是在Activity A中”这个现象,而这刚好就是我所需要的,因此在Activity A中获得了应答,并重置标签使其显示为“tab3"。


后续补充:

通过这个实例我跟踪了一下TabHost下的Activity的生命周期,有了以下小发现还有疑惑:

1.在TabHost布局下调用子activity,MainActivity并没有结束,没有pause,没有stop。可是又确确实实进入了子Activity.(疑惑:怎么能同时开启两个activity?于是我猜测的结果是:用setContent(new Intent(this, XXX.class))这种方法添加进的activity会通过某种方法显示了tabhost的布局框架,而且把自己的activity添加进了主activity=_= 本人渣新,只能这么理解,如果有解读API文档的大神烦请专业解释一下)

2.利用这种方法从C Activity返回的将是一个全新的A Activity,也就是之前的数据什么的都没了。如果需要旧的,可以从堆栈中获取,给intent添加flag就可以了

intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

尾声:

再次重申,小妹只是个渣新,以上只是我在实践中的一点小体会,留下来的当笔记用~也可以帮助和我遇到一样困难的童鞋~Tabhost中子Activity跳转到新的activity,从该activity重新返回子Activity问题解决如果有错误希望大家指点~~也呼唤大神来给我讲解一下MainActivity是一个TabHost布局下,它的子Activity是如何工作的,这两个activity的生命周期是肿么回事?~Tabhost中子Activity跳转到新的activity,从该activity重新返回子Activity问题解决


p.s:解决了一个问题,心里轻松多了~Tabhost中子Activity跳转到新的activity,从该activity重新返回子Activity问题解决看来学习好基础知识是很重要的~