android开发---平板开发中横竖屏的一些总结

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

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

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


    //一个屏幕宽高的工具类
[java]  view plain  copy
  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的配置文件中添加如下

[html]  view plain  copy
  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"。

修改后如下:

[html]  view plain  copy
  1. android:configChanges="keyboardHidden|orientation|screenSize"  
这样切换屏幕方向就只会执行一次onCreate方法了,并执行onConfigurationChanged方法了。


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

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

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

[java]  view plain  copy
  1.    public void onConfigurationChanged(Configuration newConfig) {  
  2.   
  3.     // 当新设置中,屏幕布局模式为竖屏  
  4. if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {  
  5.      RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,  
  6.                 Config.pxToDip(50));  
  7.         param.setMargins(00500);// 竖屏时要设置margin边距  
  8.         param.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); // 设置对齐为父控件的右对齐  
  9.         btn_exit.setLayoutParams(param);//给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、http://blog.csdn.net/chencehnggq/article/details/23736869

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

你可能感兴趣的:(技术文章)