横竖屏切换与状态保存的问题

前面也也说到了App横竖屏切换的时候会销毁当前的Activity然后重新创建一个,你可以自行在生命周期 的每个方法里都添加打印Log的语句,来进行判断,又或者设一个按钮一个TextView点击按钮后,修改TextView 文本,然后横竖屏切换,会神奇的发现TextView文本变回之前的内容了! 横竖屏切换时Act走下述生命周期:
onPause-> onStop-> onDestory-> onCreate->onStart->onResume
关于横竖屏切换可能遇到下述问题:

1.先说下如何禁止屏幕横竖屏自动切换吧,很简单,在AndroidManifest.xml中为Act添加一个属性:android:screenOrientation, 有下述可选值:

  • unspecified:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向。
  • landscape:横屏显示(宽比高要长)
  • portrait:竖屏显示(高比宽要长)
  • user:用户当前首选的方向
  • behind:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
  • sensor:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
  • nosensor:忽略物理感应器,这样就不会随着用户旋转设备而更改了("unspecified"设置除外)。

2.横竖屏时想加载不同的布局

1)准备两套不同的布局,Android会自己根据横竖屏加载不同布局: 创建两个布局文件夹:layout-land横屏,layout-port竖屏 然后把这两套布局文件丢这两文件夹里,文件名一样,Android就会自行判断,然后加载相应布局了!

2 )自己在代码中进行判断,自己想加载什么就加载什么:

我们一般是在onCreate()方法中加载布局文件的,我们可以在这里对横竖屏的状态做下判断,关键代码如下:

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){  
     setContentView(R.layout.横屏);
}  

else if (this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {  
    setContentView(R.layout.竖屏);
}

3. 如何让模拟器横竖屏切换

如果你的模拟器是GM的话。直接按模拟器上的切换按钮即可,原生模拟器可按ctrl + f11/f12切换!


4. 状态保存问题:

这个上面也说过了,通过一个Bundle savedInstanceState参数即可完成! 三个核心方法:

onCreate(Bundle savedInstanceState);
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle savedInstanceState);

你只重写onSaveInstanceState()方法,往这个bundle中写入数据,比如:

outState.putInt("num",1);

这样,然后你在onCreate或者onRestoreInstanceState中就可以拿出里面存储的数据,不过拿之前要判断下是否为null哦!

savedInstanceState.getInt("num");

  

posted on 2017-10-13 10:29  荣耀王者  阅读(847)  评论(0编辑  收藏  举报

导航