您的位置:首页 > 移动开发 > Android开发

android 横竖屏切换引发的几点思考

2015-04-08 15:03 197 查看
当我们在使用一款app时,比如正在看一个拖了老长老长的帖子,然后在输入框写上自己的一些心得,已入手1,2百字,如果不小心把竖屏切换到了横屏,帖子页居然“噌”一下子回到了最上头,唉呀妈呀,要重新滑下来不说,绞尽脑汁编出来的生动词句也一下子灰飞烟灭,是不是恼火加蛋疼?你会不会禁不住骂一句“fk”?!

反正如果出现这种问题,我首先会觉得这个app做的不是很好,没有考虑到用户使用上的差异性,这里的问题根源就是没有处理好该应用的横竖屏切换问题。

一个普通的赤裸裸,不加任何修饰的activity横竖屏切换时,其生命周期如图所示:



activity启动后依次调用onCreate() — onStart() — onResume(),当它切为横屏(默认是竖屏,横切竖也一样)时,该activity会被销毁掉并重新onCreate(),如上图中的红框所示,这就是为什么有的应用翻屏之后会重新载入该页面了,就是这个原因,没有对切屏做处理。

针对这个现象,我们可以作如下处理:

1、禁止横竖屏切换

2、对横竖屏切换做特殊处理

3、分别加载不同布局

1、在AndroidManifest.xml中的对应activity标签里加入配置:

android:screenOrientation="portrait" 始终以竖屏显示

android:screenOrientation="landscape" 始终以横屏显示

也可以在java类中加入代码

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏

在这里也解释一下screenOrientation的其它常用值含义:

android:screenOrientation="unspecified" 系统默认的显示

android:screenOrientation="nosensor" 屏蔽传感器的影响,就是不会受重力影响了,屏幕一样不会翻转,类似unspecified

android:screenOrientation="sensor" 受传感器影响,仍然会使屏幕翻转并重新启动activity

2、做特殊处理不让activity销毁重新加载,可以在manifest文件中的相应activity标签下加入配置:

android:configChanges="orientation|keyboardHidden

然后重写activity的如下代码:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.v(TAG, "onConfigurationChanged");
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE){
//如果是横屏,做操作
}else if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT){
//如果是竖屏,做操作
}
}




此时该activity不会被销毁,而会直接调用onConfigurationChanged()方法,如红框中所示。
注意:
android:configChanges="orientation只有这一个值时,依然会销毁。
当前API >= 13时必须再加一个值screensize,即android:configChanges="orientation|keyboardHidden|screenSize",
此时才会去调用onConfigurationChanged()方法,因为13(3.2)以后screen
size也开始跟着设备的横竖切换而改变。
3、横竖屏布局不一样的话,可以在res目录下新建两个目录layout-land和layout-port目录,相应的layout文件名不变,
不同方向的屏幕加载不同的layout。
如果横竖屏切换做了处理,可以在2的配置之后在onConfiurationChanged()方法中分别加载不同layout,代码如下:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.v(TAG, "onConfigurationChanged");
if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE){
//如果是横屏,做操作
Log.v(TAG, "横屏");
setContentView(R.layout.activity_main);
}else if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT){
//如果是竖屏,做操作
Log.v(TAG, "竖屏");
setContentView(R.layout.activity_main);
}
}
系统会去制定的land或者port目录下加载不同的layout。

如果横竖屏切换没有做处理,还是回归最初的问题,那么也可以使用该方案,做成两种布局的layout,
通过在onCreate()中做屏幕方向判断进行不同layout的加载。在此代码略。

好了,以上就是解决横竖屏切换的基本方案,通过自己的学习总结出来的,记录下来,以备以后查用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: