黑马程序员--------------- android 横竖屏相关操作
2014-09-12 09:20
375 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
今天处理了点关于android横竖屏的效果,半天下来觉得这个横竖屏的相关操作还是有很多的,废话结束--------------
首先看看最常见的横竖屏幕的控制,在清单文件中可以设置Activity是否支持横屏,要以什么样的方式展示(横屏、竖屏),常见的设置方式就是在Activity中加上
然后使用的时候可以复写 onRestoreInstanceState方法来获取之前的状态(数据):
这样就可以在横竖屏切换的时候保存activity的状态(数据),以便使用。
当然有时候我们不想让Activity在切换横竖屏的时候重新调用生命周期,因为这样很可能丢失当前Activity的状态,这时候我们就要在清单文件的Activity节点下加上android:configChanges属性了:
不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
如此一来我们就可以在onConfigurationChanged方法中去监听手机屏幕的变化,这样我们能做的事情就有很多了,改变样式,更改内容 ....
另外可以在这里有选择性的设置禁止横屏(竖屏):
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
今天处理了点关于android横竖屏的效果,半天下来觉得这个横竖屏的相关操作还是有很多的,废话结束--------------
首先看看最常见的横竖屏幕的控制,在清单文件中可以设置Activity是否支持横屏,要以什么样的方式展示(横屏、竖屏),常见的设置方式就是在Activity中加上
android:screenOrientation="XXX" ,这样就能限定该Activity是否的展示方式.看配置:<activity android:name=".ui.DetailsVideoActivity" android:hardwareAccelerated="false" android:label="@string/app_name" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@style/Theme.PageIndicatorDefaults" > </activity>android:screenOrientation="XXX",一下是XXX的属性值
“portrait” :纵向显示(高度>宽度)
“landscape” :横向显示(高度<宽度)(这两种比较常用)
“behind” :与上一个Activity一致
“user” :与用户首选项一致
“unspecified”:默认,由系统选择方向(不确定跟随系统)
“sensor” :跟随设备的方向传感器
“fullSensor” :显示设备传感器传来的四个方向 ,这样设定之后Activity也就会按照这种方式来显示了。
----------------------------------------------------------------------------------------------------- 以上最简单的设置方式,但是当屏幕由横屏切换为树屏、以及由竖屏切换到横屏的时候的处理往往是让我们感到棘手的,也正是这里才是难以处理的。在屏幕状态切换的时候通常会重新调用各个 生命周期的,相当于重新装载Activity,这时候数据往往都会消失,但是我们也可以保存切换时的状态的在Activity类里覆写onConfigurationChanged()方法来保存当前Activity的状态(数据)
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(Constant.RUL_STORE, webView.getUrl()); //保存数据 System.out.println("onSaveInstanceState" + "---->" + webView.getUrl()); }
然后使用的时候可以复写 onRestoreInstanceState方法来获取之前的状态(数据):
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if(null!=savedInstanceState) { System.out.println("onRestoreInstanceState" + "---->" + savedInstanceState.getString(Constant.RUL_STORE)); urlStore = savedInstanceState.getString(Constant.RUL_STORE); } }
这样就可以在横竖屏切换的时候保存activity的状态(数据),以便使用。
当然有时候我们不想让Activity在切换横竖屏的时候重新调用生命周期,因为这样很可能丢失当前Activity的状态,这时候我们就要在清单文件的Activity节点下加上android:configChanges属性了:
<activity android:name="com.lome.jy.MainActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/app_name" >
android:configChanges="keyboardHidden|orientation|screenSize" 加上这个之后在横竖切换的时候就不会重新调用Activity的生命周期了。 android:configChanges的设置对Activity切换横竖屏的影响还是很大的:
不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
/** * onConfigurationChanged * the package:android.content.res.Configuration. * @param newConfig, The new device configuration. * 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时, * 并且如果此时有activity正在运行,系统会调用这个函数。 * 注意:onConfigurationChanged只会监测应用程序在AnroidMainifest.xml中通过 * android:configChanges="xxxx"指定的配置类型的改动; * 而对于其他配置的更改,则系统会onDestroy()当前Activity,然后重启一个新的Activity实例。 */ @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 检测屏幕的方向:纵向或横向 if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { DisplayMetrics displaysMetrics = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics); int pixWidth= displaysMetrics.widthPixels; int height= displaysMetrics.heightPixels; LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams( pixWidth,height-20); webView.setLayoutParams(mLayoutParams); // webView.reload(); webView.refreshDrawableState(); } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { //当前为竖屏 DisplayMetrics displaysMetrics = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics); int pixWidth= displaysMetrics.widthPixels; int height= displaysMetrics.heightPixels; LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams( pixWidth,height-20); webView.setLayoutParams(mLayoutParams); webView.refreshDrawableState(); } //检测实体键盘的状态 if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO){ //实体键盘处于推出状态 } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES){ //实体键盘处于合上状态 } }
如此一来我们就可以在onConfigurationChanged方法中去监听手机屏幕的变化,这样我们能做的事情就有很多了,改变样式,更改内容 ....
另外可以在这里有选择性的设置禁止横屏(竖屏):
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
相关文章推荐
- android 横竖屏相关操作
- 黑马程序员----------Android 数据库 SQLite 相关操作
- 关于android中操作sim卡联系人的相关内容
- Android运行环境搭建(SDK与ADT相关操作)
- Android layout-dpi-横竖屏 相关知识
- 黑马程序员_Java基础_IO流(字符流缓冲区和字节流相关操作以及相关操作技巧)
- android中sim卡相关操作
- Android中Exif的操作以及Camera应用中相关代码优化方案
- Android 控制WIFI相关操作
- Android电话相关的操作 - 打电话,接电话,挂电话
- Android横竖屏切换相关总结
- Android 控制WIFI相关操作
- Android对话框相关操作技巧讲解
- Android横竖屏切换相关
- android google map apiKey 相关操作
- 黑马程序员_学习日记53_625三层项目(FTP相关操作、递归TreeView、三层结构)
- Android横竖屏切换相关总结
- Android 连接Mysql进行相关操作——用PHP做中介以及JSON做数据交换
- android google map apiKey 相关操作
- android中关于手机屏幕的相关操作(获取屏幕的宽高等操作)