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的如下代码:
此时该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,代码如下:
如果横竖屏切换没有做处理,还是回归最初的问题,那么也可以使用该方案,做成两种布局的layout,
通过在onCreate()中做屏幕方向判断进行不同layout的加载。在此代码略。
好了,以上就是解决横竖屏切换的基本方案,通过自己的学习总结出来的,记录下来,以备以后查用。
反正如果出现这种问题,我首先会觉得这个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的加载。在此代码略。
好了,以上就是解决横竖屏切换的基本方案,通过自己的学习总结出来的,记录下来,以备以后查用。
相关文章推荐
- 关于横竖屏切换问题几点知识(Android学习随笔一)
- Android横竖屏切换的解决方法
- 如何让Android横竖屏切换时不销毁当前activity
- Android Activity 禁止或屏蔽横竖屏切换
- Android横竖屏切换解决方案
- 于Android横竖屏切换的解决方法
- Android横竖屏切换的解决方法
- 如何让Android横竖屏切换时不销毁当前activity
- Android程序怎样禁止横竖屏切换
- Android布局之横竖屏切换
- [Android]横竖屏切换的屏蔽、捕获,及防止Activity的销毁
- android横竖屏切换的一点感想
- 关于Android横竖屏切换的解决方法
- Android横竖屏切换问题
- Android的横竖屏切换方案
- 如何让Android横竖屏切换时不销毁当前activity
- 如何禁止Android应用程序的横竖屏切换
- 关于Android横竖屏切换的解决方法
- Android横竖屏切换相关总结
- Android横竖屏切换解决方案