分类: 嵌入式
2012-12-09 21:01:59
横竖屏切换
应用程序在设计的时候要考虑是否进行横竖屏的切换,如何切换的问题。如果不进行设置,则默认是可以记性横竖屏切换的,这样在实际使用过程中可以出现意想不到的结果。所以应该注意这个问题。
·与横竖屏切换相关的两个目录
可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。
·与横竖屏切换相关的两个属性
属性android:screenOrientation表示activity方向的属性。值有:
·landscape 横向
·portrait 纵向
·sensor 重力感应
·nosensor 无重力感应
·unspecified 默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
·user 用户当前首选的方向
·behind 和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
如果想强制应用程序不进行屏幕切换,可以为这个属性赋landscape或者portrait属性
在AndroidManifiest.xml文件中使用android : configChanges = " keyboardHidden | orientation "这个属性,当我们横竖屏切换的时候会直接调用onConfigurationChanged方法,而不会重新执行onCreate方法。所以设置了上面的属性之后,可以在程序中重载这个函数
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//if(this.getResources().getConfiguration().orientation== Configuration.ORIENTATION_LANDSCAPE)
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
tv.setText("横屏");
setContentView(R.layout.file_list_landscape);
}else{
tv.setText("竖屏");
setContentView(R.layout.file_list);
}
}
但在Android3.2(API level 13)以后,应该添加的属性为:
Android:configchanges = “orientation|screenSize”
·程序实现横竖屏的切换处理
android中每次屏幕的切换都会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,就能恢复原来的画面
屏切换竖屏实际上是先把当前的横屏的Activity杀掉 然后重新创建一个竖屏的Activity,我们可以使用onSaveInstanceState()方法保存数据,它是在横屏Activity将杀死前调用,可以将须要保存的数据放入Bundle封装在系统中,切换竖屏后这个Activity又重新被创建 这样可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle)方法中来回复之前保存在Bundle中的数据,这样就可以实现横竖屏界面切换数据的保存与读取,当然前提是只能保存Bundle类型的数据,也就是说大量的对象数据的话就要想其它办法来恢复
代码:
/**切换屏幕之前将数据保存在Bundle中**/
@Override
protected void onSaveInstanceState(Bundle outState) {
long outTime = System.currentTimeMillis();
//屏幕切换将当前的时候保存在Bundle中
outState.putLong("time", outTime);
Log.v("InstanceState", "outTime is "+ outTime);
super.onSaveInstanceState(outState);
}
/**切换屏幕之后在Bundle中把数据取出来**/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
//取出屏幕切换前保存的时间
Long saveTime = savedInstanceState.getLong("time");
Log.v("InstanceState", "saveTime is "+ saveTime);
super.onRestoreInstanceState(savedInstanceState);
}