最近在做一个android 的平板项目,属于二次开发,这个项目原来的布局界面都是横向写死,现在的需要是适应横竖屏2个方向。
所以我的方法是,onCreate()方法时,通过获取屏幕宽高,如果发现是竖屏,需要重新把原来的横屏布局用代码形式重新布局,如果是横屏,使用默认的布局不用修改
int width=DensityUtil.getWindowWidth();//这里使用了一个自己写的工具类
int height=DensityUtil.getWindowHeight();
if(height>width){
//说明是竖屏,根据需要改变里面控件的布局
}//否则是横屏,不改栋
/** 获取屏幕宽度 */
@SuppressWarnings("deprecation")
public static int getWindowWidth() {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
return wm.getDefaultDisplay().getWidth();
}
/** 获取屏幕高度 */
@SuppressWarnings("deprecation")
public static int getWindowHeight() {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
return wm.getDefaultDisplay().getHeight();
}
首先,我们要打开平板的屏幕旋转功能,同时,在Android开发中,如果某些事件触发(例如:旋屏事件),则Activity会重新调用onCreate方法,对Activity重新初始化,这样不仅效率低,而且会造成数据丢失,解决办法是重写onConfigurationChanged方法,并在AndroidManifest.xml中对Activity声明configChanges,这样特定事件触发就会调用onConfigurationChanged方法,而不是执行onCreate方法重新初始化。
1、先去activity的配置文件中添加如下
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"。
修改后如下:
android:configChanges="keyboardHidden|orientation|screenSize"
这样切换屏幕方向就只会执行一次onCreate方法了,并执行onConfigurationChanged方法了。
2、重写onConfigurationChanged,对里面控件布局进行修改
比如,竖屏btn的文字要小,所占空间的width也要小。
横屏btn的文字要 ,所占空间的width也要大。
public void onConfigurationChanged(Configuration newConfig) {
// 当新设置中,屏幕布局模式为竖屏
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
Config.pxToDip(50));
param.setMargins(0, 0, 50, 0);// 竖屏时要设置margin边距
param.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); // 设置对齐为父控件的右对齐
btn_exit.setLayoutParams(param);//给button控件设置布局属性
} else {
// 否则是横屏
}
// 一定不能省去,否则将引发:android.app.SuperNotCalledException 异常。
super.onConfigurationChanged(newConfig);
}
参考资料
1、http://blog.sina.com.cn/s/blog_5a6f39cf010193ky.html
代码中设置android:layout_centerInParent属性
2、http://blog.csdn.net/chencehnggq/article/details/23736869
onConfigurationChanged事件并不是只有屏幕方向改变才可以触发,其他的一些系统设置改变也可以触发,比如打开或者隐藏键盘。