Android 横竖屏切换加载不同的布局

 参考 https://blog.csdn.net/zhoup324/article/details/53182065

1.禁止APP内横竖屏切换

在 配 置 Activity 的 地 方 进 行 如 下 的 配 置

  • android:screenOrientation="portrait"(landscape 是横向,portrait 是纵向)。这样就可以保证是竖屏总是竖屏
  • android:screenOrientation="landscape"(landscape 是横向,portrait 是纵向)。这样就可以保证是横屏总是横屏

上述修改也可以在Java代码中通过类似如下代码来设置

  • setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

2.重启Activity的横竖屏切换的处理

缺省状态下,Activity每次横竖屏切换(包括用setRequestedOrientation调用)都会重新调用一轮onPause-> onStop-> onDestory-> onCreate->onStart->onResume操作,从而销毁原来的Activity对象,创建新的Activity对象,这是因为通常情况下软件在横竖屏之间切换,界面的高宽会发生转换,从而可能会要求不同的布局。

  1. 在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序自己会调用Activity的onCreate方法,从而根据当前横竖屏情况自动加载响应的布局。
  2. 假如布局资源是不一样又不按照如上设置,则需要通过java代码来判断当前是横屏还是竖屏然后来加载相应的xml布局文件(比如mainP为竖屏mainL为横屏)。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的onCreate方法,你可以把以下方法放在你的onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layout xml。

上面这两种方式实现对于横竖屏的切换加载不同的布局文件,都会让activity重新加载一次,那么必然就会导致数据的丢失或者是数据的重新获取,造成了过多的额外的功耗,那么我们可以在翻转之前保存一下现在已经获取到的数据,那么在翻转之后就可以直接使用,而不需要重新获取或者重新加载,具体在下面看

  • 重写Activity.onRetainNonConfigurationInstance(),用户横竖屏切换前保存数据
  • 在onCreate()函数中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据
重写Activity.onRetainNonConfigurationInstance(),用户横竖屏切换前保存数据
 
@Override 
 
public Object onRetainNonConfigurationInstance() { 
 
    final MyDataObject data = collectMyLoadedData(); 
 
    return data; 
 
}
 
在onCreate()函数中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据
 
@Override 
 
public void onCreate(Bundle savedInstanceState) { 
 
    super.onCreate(savedInstanceState); 
 
    setContentView(R.layout.main); 
 
 
 
    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); 
 
    if (data == null) { 
 
        data = loadMyData(); 
 
    } 
 
    ... 
 
}

3.非重启Activity的横竖屏切换的处理

虽然重启Activity为我们提供了保存数据和读取数据的方式,但是如此一来程序会显得有些繁琐,所以有时候程序员往往就不想让Activity重启,Android也为我们提供了解决方案,就是通过onConfigurationChanged拦截横竖屏变换,从而进行必要的重新布局和切换操作。

操作步骤如下:

  • 首先,manifest中为相应的Activity设置android:configChanges属性,从而让Activity不延续上述的重建流程
Andorid 3.2以前的SDK可以使用如下配置
 
android:configChanges="orientation|keyboardHidden"
 
而Adnroid 3.2以后的SDK必须添加一个screenSize属性,具体如下
 
android:configChanges="keyboardHidden|orientation|screenSize"
 
或者
 
android:configChanges="orientation|screenSize"
  • 然后重写activity中onConfigurationChanged 方法
@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
                  if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_
LANDSCAPE){
         //TODO
          }else
               if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_
PORTRAIT){
           //TODO
         }
}

猜你喜欢

转载自blog.csdn.net/hd12370/article/details/82830746