Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530463
  • 博文数量: 26
  • 博客积分: 509
  • 博客等级: 下士
  • 技术积分: 809
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-15 18:01
文章分类

全部博文(26)

文章存档

2015年(1)

2013年(6)

2012年(19)

分类: 嵌入式

2012-12-09 21:01:59

横竖屏切换

应用程序在设计的时候要考虑是否进行横竖屏的切换,如何切换的问题。如果不进行设置,则默认是可以记性横竖屏切换的,这样在实际使用过程中可以出现意想不到的结果。所以应该注意这个问题。

 

·与横竖屏切换相关的两个目录

可以在res目录下建立layout-portlayout-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.2API level 13)以后,应该添加的属性为:

Androidconfigchanges = “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);  
    }  

 

阅读(6719) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~