最近在做一个Android 的平板项目,属于二次开发,这个项目原来的布局界面都是横向写死,现在的需要是适应横竖屏2个方向。

所以我的方法是,onCreate()方法时,通过获取屏幕宽高,如果发现是竖屏,需要重新把原来的横屏布局用代码形式重新布局,如果是横屏,使用默认的布局不用修改



1. int width=DensityUtil.getWindowWidth();//这里使用了一个自己写的工具类  
2. int height=DensityUtil.getWindowHeight();  
3. if(height>width){  
4. //说明是竖屏,根据需要改变里面控件的布局  
5. //否则是横屏,不改栋



    //一个屏幕宽高的工具类



1. /** 获取屏幕宽度 */  
2. @SuppressWarnings("deprecation")  
3. public static int getWindowWidth() {  
4.     WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
5. return wm.getDefaultDisplay().getWidth();  
6. }  
7.   
8. /** 获取屏幕高度 */  
9. @SuppressWarnings("deprecation")  
10. public static int getWindowHeight() {  
11.     WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
12. return wm.getDefaultDisplay().getHeight();  
13. }



首先,我们要打开平板的屏幕旋转功能,同时,在android开发中,如果某些事件触发(例如:旋屏事件),则Activity会重新调用onCreate方法,对Activity重新初始化,这样不仅效率低,而且会造成数据丢失,解决办法是重写onConfigurationChanged方法,并在AndroidManifest.xml中对Activity声明configChanges,这样特定事件触发就会调用onConfigurationChanged方法,而不是执行onCreate方法重新初始化。


1、先去activity的配置文件中添加如下




1. android:configChanges="keyboardHidden|orientation"


但是我们横竖屏切换时,发现activity的onCreate方法还是会执行,不是我们期望的只执行一次。查找资料原因如下

自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。
因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation"你还必须设置"ScreenSize"。

修改后如下:


1. android:configChanges="keyboardHidden|orientation|screenSize"

这样切换屏幕方向就只会执行一次onCreate方法了,并执行onConfigurationChanged方法了。


2、重写onConfigurationChanged,对里面控件布局进行修改

比如,竖屏btn的文字要小,所占空间的width也要小。

             横屏btn的文字要 ,所占空间的width也要大。



1.    public void onConfigurationChanged(Configuration newConfig) {  
2.   
3. // 当新设置中,屏幕布局模式为竖屏  
4. if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {  
5. new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,  
6. 50));  
7. 0, 0, 50, 0);// 竖屏时要设置margin边距  
8. // 设置对齐为父控件的右对齐  
9. //给button控件设置布局属性  
10.   
11. else {  
12. // 否则是横屏  
13.     }  
14. // 一定不能省去,否则将引发:android.app.SuperNotCalledException 异常。  
15. super.onConfigurationChanged(newConfig);  
16.   
17. }


参考资料

1、http://blog.sina.com.cn/s/blog_5a6f39cf010193ky.html

代码中设置android:layout_centerInParent属性

2、

onConfigurationChanged事件并不是只有屏幕方向改变才可以触发,其他的一些系统设置改变也可以触发,比如打开或者隐藏键盘。