序
上周在开发时,发现一种更好的方式处理横竖屏切换,节省了不少代码。之前在切换横竖屏,同时都是写了两个Actiity页面,两个页面分别对应不同的布局,通过跳转实现切换。后来发现在一个Activity页面就可以完成这些工作,布局文件名字相同但放在不同的layout目录(layout-land和layout-port)。
正文
- 控制页面的横竖屏显示方式
一种方法是在AndroidManifest.xml中定义该Activity的android:screenOrientation属性,
"unspecified"
默认值,由系统来判断显示方向。
"landscape"
横屏显示
"portrait"
竖屏显示
“user"
用户当前首选的方向
"behind"
与上一个Activity方向一致
"sensor"
有物理的传感器来决定
"nosensor"
忽略物理传感器
另一种方法是在Java代码中设置,setRequestedOrientaion();
- 处理横竖屏切换
方法一:在res目录建立layout-land和layout-port目录,横竖屏的布局分别放在这两个目录(相同的布局文件名字)。程序运行时,会根据横竖屏状态,自动加载布局文件。
方法二:将不同布局文件放在layout目录,手动根据横竖屏状态来加载布局文件。
/** * 获取横竖屏状态 */ private void getScreenState() { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏 } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // 竖屏 } }
- 页面重载问题
Actvity在每次横竖屏切换时都会重新调用onPause->onStop->onDestroy->onCreate->onStart->onResume。
如果页面不需要重新载入,可以在AndroidManifest.xml中设置该Activity的android:configChanges属性。覆盖Activity的onConfigurationChanged方法,来处理横竖屏切换。
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // land } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // port } }