Android 屏幕旋转相关解析

qiaosu2012 8年前
   <p><strong>这篇博文给大家介绍下,当手机屏幕旋转时我们应当怎么去处理,首先了解下默认情况下Android进行屏幕旋转的原理,当手机进行旋转时重力感应sensor起到作用,会将Activity销毁并按照横屏的屏幕尺寸进行重新构造,生命周期如下图所示,一句话总结就是默认情况下Activity进行屏幕旋转会自动进行onDestroy并重新onCreate。</strong></p>    <p><img alt="这里写图片描述" src="https://simg.open-open.com/show/e2a6f2bf205c8901bca3ea11ab45b7ef.png"></p>    <p>*onSaveInstanceState和onRestoreInstanceState用处后面会介绍到。</p>    <p><strong>先介绍2种非默认情况下的操作</strong></p>    <p>1:禁止屏幕旋转</p>    <p>在AndroidManifest.xml的Activity中配置</p>    <p>始终竖屏</p>    <pre>  <code class="language-java">android:screenOrientation="portrait" </code></pre>    <p>始终横屏</p>    <pre>  <code class="language-java">android:screenOrientation="landscape"</code></pre>    <p>2:Activity跟随旋转但不销毁和重启</p>    <p>这个实现原理是告诉系统这个Activity的旋转处理由我们自己去处理,不用帮我销毁和重启</p>    <p>在AndroidManifest.xml的Activity中配置</p>    <pre>  <code class="language-java">android:configChanges="keyboardHidden|orientation|screenSize"</code></pre>    <p>然后在Activity中进行方法复写,监听屏幕旋转并处理</p>    <pre>  <code class="language-java">    @Override      public void onConfigurationChanged(Configuration newConfig) {          super.onConfigurationChanged(newConfig);            if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {              Toast.makeText(MainActivity.this, "竖屏模式", 3000).show();          } else {              Toast.makeText(MainActivity.this, "横屏模式", 3000).show();          }        }</code></pre>    <p><strong>接下来介绍,Activity进行默认旋转时候的处理,当屏幕进行旋转的时候会按照横屏的分辨率进行重绘,当然你也可以不进行任何处理难看就难看呗:),理想状态的处理就是建立两套同名的Layout,当屏幕旋转时系统会自动帮我们加载横屏的Layout。</strong></p>    <p>首先在工程res目录下新建一个layout-land 这个目录下是专门为横屏Layout准备的</p>    <p><img alt="这里写图片描述" src="https://simg.open-open.com/show/11f31e63e5477e28dc05702cad0082af.png"></p>    <p>然后建立一个同名不同样的布局文件就Ok了,我在竖屏的Layout建立了上下的Button在横屏的Layout建立了横排并列的Button<br> 看一下运行效果</p>    <p><img alt="这里写图片描述" src="https://simg.open-open.com/show/df71324b07c678a911ba56dd2ec75f48.gif"></p>    <p>可以看到系统已经帮我们自动在横竖屏转换的时候切换了Layout,这样就实现了横竖屏的基本适配,但是这样简单的处理会出现问题,什么问题呢?当我们点击第一个Button为TextView设置字符串后再旋转屏幕看看会发生什么?</p>    <p><img alt="这里写图片描述" src="https://simg.open-open.com/show/20e1fd74fd9d53dac0a10386751a6dd3.gif"></p>    <p>运行后可以看到,我们已经为TextView设置了值但是屏幕旋转后值却不见了,这是因为之前说过的屏幕旋转后系统自动帮我们销毁了Activity所以之前设置的东西就不见了,这个怎么去解决呢?这就要靠Android系统给我们提供的onSaveInstanceState和onRestoreInstanceState来进行数据的保存和恢复,onSaveInstanceState会在onDestroy之前被调用,我们可以利用它来进行一些数据的保存,这里我们保存TextView设置的值。</p>    <pre>  <code class="language-java">//保存Activity数据      @Override      protected void onSaveInstanceState(Bundle outState) {          outState.putString("textview", mTextView.getText().toString());          super.onSaveInstanceState(outState);      }</code></pre>    <p>然后我们在重启Activity后如何得到之前保存的数据呢?这里有两种方法</p>    <p>1:在onCreate中</p>    <pre>  <code class="language-java"> @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          mTextView=(TextView)findViewById(R.id.textView);          //恢复数据          if (savedInstanceState != null) {              // Restore value of members from saved state              mTextView.setText(savedInstanceState.getString("textview"));          }        }</code></pre>    <p>可以看到,onCreate的万年不用的Bundle对象终于让我们用上了。</p>    <p>2:第二种方法是复写onRestoreInstanceState方法</p>    <pre>  <code class="language-java">      @Override      protected void onRestoreInstanceState(Bundle savedInstanceState) {          super.onRestoreInstanceState(savedInstanceState);          mTextView.setText(savedInstanceState.getString("textview"));      }</code></pre>    <p>这里不需要判断Bundle对象是否为空,因为系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState()</p>    <p>再次运行看看效果</p>    <p><img alt="这里写图片描述" src="https://simg.open-open.com/show/f681345259c714b63ee0b5dae68450f4.gif"></p>    <p>可以看到屏幕进行旋转,Activity进行销毁重建后数据依然存在</p>    <p>最后再介绍个方法,手动让Activity进行旋转</p>    <pre>  <code class="language-java">//设置Activity横屏显示  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  //设置Activity竖屏显示  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);</code></pre>    <p>到此一些关于Android屏幕旋转的适配和常用操作技巧就介绍完了,欢迎大家在下面留言。</p>    <p>[本篇源码下载]<br> (<a href="/misc/goto?guid=4959671699046618039">http://download.csdn.net/detail/leejizhou/9500995</a>)</p>    <p>来自: <a href="/misc/goto?guid=4959671699146119388" rel="nofollow">http://blog.csdn.net/leejizhou/article/details/51233342</a></p>