本人渣新才开始学android没多久,在开发中就遇到这样一个问题。
问题描述:
我现在有一个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布局下的样子了,也就是底下的选项卡没了。
以上就是我遇到的问题了,问题抽象描述一下就是这样:
当主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);
尾声:
再次重申,小妹只是个渣新,以上只是我在实践中的一点小体会,留下来的当笔记用~也可以帮助和我遇到一样困难的童鞋~如果有错误希望大家指点~~也呼唤大神来给我讲解一下MainActivity是一个TabHost布局下,它的子Activity是如何工作的,这两个activity的生命周期是肿么回事?~
p.s:解决了一个问题,心里轻松多了~看来学习好基础知识是很重要的~