android4.0 转屏(切屏)重复执行onCreate() (tabhost 解决)

zq1548 2013-04-03 02:33:59
注明来源 http://ming.highgic.com/?p=545
找了半天才找到能解决问题的帖子,放到这 方面更多的人能搜索到。。

如果你需要实现标题这样的功能,并且搜到了我这篇文章,那恭喜你,你是幸运的。

我一般不喜欢解决常见问题或者实现基本需求的常规文章,因为这样的文章网上一搜一大堆,我再写的话,文笔和逻辑都写的没人家好,有点滥竽充数,所以我这篇文章,不是告诉你转屏(切屏)禁止当前Activity销毁,禁止重新创建Activity,走onCreate() 的方法,这样的方法,网上一大堆文章,而大部分都是很坑爹的。不仅没帮我解决问题,还把我死往里坑。下面就讲述一下我解决转屏的坎坷经历。

首先描述一下我要实现的目标:在我的某个应用里的某个界面,比如新建短信界面,当我编辑了收件人或短信内容,然后我从竖屏转到横屏继续编辑,结果我之前编辑的收件人和短信内容,全部不见了,坑爹啊,花了我半个小时深情满满的给男友(女友)抠出来情意绵绵的短信内容全白费了,只好重新编写,可是不管之前的内容是否每个字都还能记住,但第一次编辑短信的那份爱意浓浓的情感也早就没有了,如果是这样的应用真是坑人,这样的情况还有很多,比如记事本等。现在就是要解决这个问题,怎么在转屏了以后仍然保持编辑的内容。大家一上网搜就知道,原来出现这个问题是因为,转屏的时候,把我们当前的activity给销毁了,重新创建了一个新的Activity,从而,又走了一遍onCreate(),而大部分人一般在onCreate()就是做些初始化的工作,所以,上个Activity的东西没有保存下来,传到新建的这个Activity中,然后这里,网上的文章通常会跟你说有两种方法,

第一种:转屏时禁止当前activity销毁,不重新创建activity并调用onCreate()方法,办法是在 AndroidManifest.xml 文件中对 当前Activity 添加配置属性android:configChanges=”orientation|keyboardHidden”,既可以实现禁用,然后如果还想监听到转屏的动作,可以在当前Activity 内复写onConfigurationChanged() 方法,做一些操作。

第二种:在当前Activity中复写onSaveInstanceState(Bundle outState)方法,在此方法内,把Activity在销毁之前要保存的数据存入Bundle 中,然后在onCreate(Bundle savedInstanceState)savedInstanceState中,将存入的数据取出,或者不再onCreate取,复写onRestoreInstanceState()方法,在这里边取也可以,但要注意的是onSaveInstanceState()方法是在onPausse()之前调用,onRestoreInstanceState()是在onStart()之后调用,这样,也可以实现信息的延续,如下:

存入数据:

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);
outState.putInt("state",state);
}

取出数据:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if(savedInstanceState!=null){
state=savedInstanceState.getInt("state");
}



或者复写

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);

state=savedInstanceState.getInt("state");

}
第三种:禁止转屏,只允许横屏或者竖屏,方法:在 AndroidManifest.xml 文件中对当前Activity 添加配置属性 android:screenOrientation=”landscape” ,(landscape是横向,portrait是纵向),这样当然可以实现转屏时,数据保留的实现,可是,有些应用对于转屏是客户的正常的需求和体验,这个方法就不可取了。

上面三种方法,网上都有很多资料,我在此只是给大家梳理一下。下面,我就可能遇到的问题,可能是导致你最后无法实现的问题做一下补充。



重点来了,必看!!!
第一:其实android3.2以上的机器在按第一种方法设置是不起作用的,必须加上screenSize才行,即设置为这样android:configChanges=”orientation|screenSize|keyboardHidden”才会起作用,网上很少有告诉你这样设置的,很多都是像我说的第一种方法那样设置,结果你设置来设置去就是不起作用,抓破脑袋也想不出为什么。



第二:如果你的activity是TabWidget中的一个activity,那么就算你按上面的那样设置,同样还是不起作用,你必须在主Activity中添加上面的设置,才起作用,这个我在网上没有看到任何的文章有提示这个,是我自己试出来,如果你不知道的话,同样可能导致你抓破头皮也想不出来。唉。。。程序员真是个死脑细胞的活啊(题外话)。

好啦,如果你按照这样的设置,基本上,你的问题可以解决了,如果你的问题还是无法解决的话,可以留言一起探讨。
...全文
715 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
梅州小罗 2014-09-19
  • 打赏
  • 举报
回复
android:configChanges="orientation|screenSize|keyboardHidden" 请教一下,我在Activity里面做了这样的设置,转屏的时候不会重新调用onCreate方法了,但是不会加载对应的界面,请问有什么方法,谢谢!
魅离儿 2014-09-12
  • 打赏
  • 举报
回复
between bug and debug_
Android女孩 2014-09-12
  • 打赏
  • 举报
回复
赞一个,帮我解决了问题
android小新手 2014-08-06
  • 打赏
  • 举报
回复
我的是tabhost 但是我根据你上面的设置还是不行啊,请问一下 这是怎么回事!!!????
pangjl1982 2014-04-11
  • 打赏
  • 举报
回复
华为D2-5000手机,底部的软键盘不关闭能监控到转屏,但是关闭的话转屏接收不到信息
jinglier 2014-04-10
  • 打赏
  • 举报
回复
非常感谢你的文章,帮我解决了问题。
我多想念 2014-04-09
  • 打赏
  • 举报
回复
请问,我做了一个更改布局背景的设置,我应该怎么保存,现在的情况是 更改完成了,可是退出程序之后在点击程序 进入又是默认的背景图片,而不是我设置的背景, 我不知道怎么往里面写值,我是菜鸟新手.
「已注销」 2013-10-25
  • 打赏
  • 举报
回复
楼主写的也有问题 android:configChanges=orientation|screenSize|keyboardHidden” 引号应该为英文的 害我该了半天
jgszhuzhu 2013-06-07
  • 打赏
  • 举报
回复
应该不用你考虑的那么复杂吧,不管转屏还是其他,你把数据放在软应用里面就OK了,根据生命周期顺序来就好了
zq1548 2013-06-07
  • 打赏
  • 举报
回复
你的activity 是在 tabhost 里面吗, 如果在的话, tabhost 和你的activity 都要设置那个属性
xuyun_245601871 2013-05-30
  • 打赏
  • 举报
回复
我设置了android:screenOrientation=”landscape”,还是Create两次,请指教。

80,363

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧