Android 屏幕旋转相关解析
2016-06-02 10:31
423 查看
原创文章,转载请注明 ( 来自:http://blog.csdn.net/leejizhou/article/details/51233342 李济洲的博客 )
这篇博文给大家介绍下,当手机屏幕旋转时我们应当怎么去处理,首先了解下默认情况下Android进行屏幕旋转的原理,当手机进行旋转时重力感应sensor起到作用,会将Activity销毁并按照横屏的屏幕尺寸进行重新构造,生命周期如下图所示,一句话总结就是默认情况下Activity进行屏幕旋转会自动进行onDestroy并重新onCreate。
*onSaveInstanceState和onRestoreInstanceState用处后面会介绍到。
先介绍2种非默认情况下的操作
1:禁止屏幕旋转
在AndroidManifest.xml的Activity中配置
始终竖屏
始终横屏
2:Activity跟随旋转但不销毁和重启
这个实现原理是告诉系统这个Activity的旋转处理由我们自己去处理,不用帮我销毁和重启
在AndroidManifest.xml的Activity中配置
然后在Activity中进行方法复写,监听屏幕旋转并处理
接下来介绍,Activity进行默认旋转时候的处理,当屏幕进行旋转的时候会按照横屏的分辨率进行重绘,当然你也可以不进行任何处理难看就难看呗:),理想状态的处理就是建立两套同名的Layout,当屏幕旋转时系统会自动帮我们加载横屏的Layout。
首先在工程res目录下新建一个layout-land 这个目录下是专门为横屏Layout准备的
然后建立一个同名不同样的布局文件就Ok了,我在竖屏的Layout建立了上下的Button在横屏的Layout建立了横排并列的Button
看一下运行效果
可以看到系统已经帮我们自动在横竖屏转换的时候切换了Layout,这样就实现了横竖屏的基本适配,但是这样简单的处理会出现问题,什么问题呢?当我们点击第一个Button为TextView设置字符串后再旋转屏幕看看会发生什么?
运行后可以看到,我们已经为TextView设置了值但是屏幕旋转后值却不见了,这是因为之前说过的屏幕旋转后系统自动帮我们销毁了Activity所以之前设置的东西就不见了,这个怎么去解决呢?这就要靠Android系统给我们提供的onSaveInstanceState和onRestoreInstanceState来进行数据的保存和恢复,onSaveInstanceState会在onDestroy之前被调用,我们可以利用它来进行一些数据的保存,这里我们保存TextView设置的值。
然后我们在重启Activity后如何得到之前保存的数据呢?这里有两种方法
1:在onCreate中
可以看到,onCreate的万年不用的Bundle对象终于让我们用上了。
2:第二种方法是复写onRestoreInstanceState方法
这里不需要判断Bundle对象是否为空,因为系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState()
再次运行看看效果
可以看到屏幕进行旋转,Activity进行销毁重建后数据依然存在
最后再介绍个方法,手动让Activity进行旋转
到此一些关于Android屏幕旋转的适配和常用操作技巧就介绍完了,欢迎大家在下面留言。
[本篇源码下载]
(http://download.csdn.net/detail/leejizhou/9500995)
这篇博文给大家介绍下,当手机屏幕旋转时我们应当怎么去处理,首先了解下默认情况下Android进行屏幕旋转的原理,当手机进行旋转时重力感应sensor起到作用,会将Activity销毁并按照横屏的屏幕尺寸进行重新构造,生命周期如下图所示,一句话总结就是默认情况下Activity进行屏幕旋转会自动进行onDestroy并重新onCreate。
*onSaveInstanceState和onRestoreInstanceState用处后面会介绍到。
先介绍2种非默认情况下的操作
1:禁止屏幕旋转
在AndroidManifest.xml的Activity中配置
始终竖屏
<code class="hljs avrasm has-numbering"><span class="hljs-label">android:</span>screenOrientation=<span class="hljs-string">"portrait"</span> </code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>
始终横屏
<code class="hljs avrasm has-numbering"><span class="hljs-label">android:</span>screenOrientation=<span class="hljs-string">"landscape"</span></code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>
2:Activity跟随旋转但不销毁和重启
这个实现原理是告诉系统这个Activity的旋转处理由我们自己去处理,不用帮我销毁和重启
在AndroidManifest.xml的Activity中配置
<code class="hljs avrasm has-numbering"><span class="hljs-label">android:</span>configChanges=<span class="hljs-string">"keyboardHidden|orientation|screenSize"</span></code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>
然后在Activity中进行方法复写,监听屏幕旋转并处理
<code class="hljs java has-numbering"> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onConfigurationChanged</span>(Configuration newConfig) { <span class="hljs-keyword">super</span>.onConfigurationChanged(newConfig); <span class="hljs-keyword">if</span> (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Toast.makeText(MainActivity.<span class="hljs-keyword">this</span>, <span class="hljs-string">"竖屏模式"</span>, <span class="hljs-number">3000</span>).show(); } <span class="hljs-keyword">else</span> { Toast.makeText(MainActivity.<span class="hljs-keyword">this</span>, <span class="hljs-string">"横屏模式"</span>, <span class="hljs-number">3000</span>).show(); } }</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>
接下来介绍,Activity进行默认旋转时候的处理,当屏幕进行旋转的时候会按照横屏的分辨率进行重绘,当然你也可以不进行任何处理难看就难看呗:),理想状态的处理就是建立两套同名的Layout,当屏幕旋转时系统会自动帮我们加载横屏的Layout。
首先在工程res目录下新建一个layout-land 这个目录下是专门为横屏Layout准备的
然后建立一个同名不同样的布局文件就Ok了,我在竖屏的Layout建立了上下的Button在横屏的Layout建立了横排并列的Button
看一下运行效果
可以看到系统已经帮我们自动在横竖屏转换的时候切换了Layout,这样就实现了横竖屏的基本适配,但是这样简单的处理会出现问题,什么问题呢?当我们点击第一个Button为TextView设置字符串后再旋转屏幕看看会发生什么?
运行后可以看到,我们已经为TextView设置了值但是屏幕旋转后值却不见了,这是因为之前说过的屏幕旋转后系统自动帮我们销毁了Activity所以之前设置的东西就不见了,这个怎么去解决呢?这就要靠Android系统给我们提供的onSaveInstanceState和onRestoreInstanceState来进行数据的保存和恢复,onSaveInstanceState会在onDestroy之前被调用,我们可以利用它来进行一些数据的保存,这里我们保存TextView设置的值。
<code class="hljs java has-numbering"><span class="hljs-comment">//保存Activity数据</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onSaveInstanceState</span>(Bundle outState) { outState.putString(<span class="hljs-string">"textview"</span>, mTextView.getText().toString()); <span class="hljs-keyword">super</span>.onSaveInstanceState(outState); }</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>
然后我们在重启Activity后如何得到之前保存的数据呢?这里有两种方法
1:在onCreate中
<code class="hljs java has-numbering"> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) { <span class="hljs-keyword">super</span>.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView=(TextView)findViewById(R.id.textView); <span class="hljs-comment">//恢复数据</span> <span class="hljs-keyword">if</span> (savedInstanceState != <span class="hljs-keyword">null</span>) { <span class="hljs-comment">// Restore value of members from saved state</span> mTextView.setText(savedInstanceState.getString(<span class="hljs-string">"textview"</span>)); } }</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>
可以看到,onCreate的万年不用的Bundle对象终于让我们用上了。
2:第二种方法是复写onRestoreInstanceState方法
<code class="hljs java has-numbering"> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onRestoreInstanceState</span>(Bundle savedInstanceState) { <span class="hljs-keyword">super</span>.onRestoreInstanceState(savedInstanceState); mTextView.setText(savedInstanceState.getString(<span class="hljs-string">"textview"</span>)); }</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>
这里不需要判断Bundle对象是否为空,因为系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState()
再次运行看看效果
可以看到屏幕进行旋转,Activity进行销毁重建后数据依然存在
最后再介绍个方法,手动让Activity进行旋转
<code class="hljs scss has-numbering"><span class="hljs-comment">//设置Activity横屏显示</span> <span class="hljs-function">setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)</span>; <span class="hljs-comment">//设置Activity竖屏显示</span> <span class="hljs-function">setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)</span>;</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>
到此一些关于Android屏幕旋转的适配和常用操作技巧就介绍完了,欢迎大家在下面留言。
[本篇源码下载]
(http://download.csdn.net/detail/leejizhou/9500995)
相关文章推荐
- Android init.rc如何启动service去执行sh脚本
- Android init.rc如何启动service去执行sh脚本
- Android init.rc如何启动service去执行sh脚本
- Android init.rc如何启动service去执行sh脚本
- Android init.rc如何启动service去执行sh脚本
- AndroidStudio的一些实用技巧
- 禁止ScrollView自动滑动到底部
- 在MAC上开发Android项目系列—1—给MAC配置牛逼的Android模拟器
- Android Studio中如何使用Git和Github来管理项目
- Android 签名发布 签名脚本
- Android 热修复之AndFix混淆
- 从多方面理解 Android 体系结构
- Android之通过资源名称获取资源Id
- Android模拟器实现手机添加文件到sd卡的方法
- AndroidStudio配色方案和Sexy Editor插件
- Otto框架的使用
- 关于在recycleview中点击item获取对应的viewholder的方法
- 你必须了解的Android 6.0权限申请
- Java4Android第9课:包和权限
- Android拍照 图库照片本地显示