打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android 屏幕旋转适配全解析

这篇博文给大家介绍下,当手机屏幕旋转时我们应当怎么去处理,首先了解下默认情况下Android进行屏幕旋转的原理,当手机进行旋转时重力感应sensor起到作用,会将Activity销毁并按照横屏的屏幕尺寸进行重新构造,生命周期如下图所示,一句话总结就是默认情况下Activity进行屏幕旋转会自动进行onDestroy并重新onCreate。

  

 

  *onSaveInstanceState和onRestoreInstanceState用处后面会介绍到。

  先介绍2种非默认情况下的操作

  1:禁止屏幕旋转

  在AndroidManifest.xml的Activity中配置

  始终竖屏

  

1
android:screenOrientation="portrait"

始终横屏

1
<code class="hljs avrasm">android:screenOrientation="landscape"</code>

2:Activity跟随旋转但不销毁和重启

这个实现原理是告诉系统这个Activity的旋转处理由我们自己去处理,不用帮我销毁和重启

在AndroidManifest.xml的Activity中配置

1
<code class="hljs avrasm">android:configChanges="keyboardHidden|orientation|screenSize"</code>

然后在Activity中进行方法复写,监听屏幕旋转并处理

1
2
3
4
5
6
7
8
9
10
11
<code class="hljs 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>

接下来介绍,Activity进行默认旋转时候的处理,当屏幕进行旋转的时候会按照横屏的分辨率进行重绘,当然你也可以不进行任何处理难看就难看呗:),理想状态的处理就是建立两套同名的Layout,当屏幕旋转时系统会自动帮我们加载横屏的Layout。

首先在工程res目录下新建一个layout-land 这个目录下是专门为横屏Layout准备的

 

 

然后建立一个同名不同样的布局文件就Ok了,我在竖屏的Layout建立了上下的Button在横屏的Layout建立了横排并列的Button

看一下运行效果

 

 

可以看到系统已经帮我们自动在横竖屏转换的时候切换了Layout,这样就实现了横竖屏的基本适配,但是这样简单的处理会出现问题,什么问题呢?当我们点击第一个Button为TextView设置字符串后再旋转屏幕看看会发生什么?

 

运行后可以看到,我们已经为TextView设置了值但是屏幕旋转后值却不见了,这是因为之前说过的屏幕旋转后系统自动帮我们销毁了Activity所以之前设置的东西就不见了,这个怎么去解决呢?这就要靠Android系统给我们提供的onSaveInstanceState和onRestoreInstanceState来进行数据的保存和恢复,onSaveInstanceState会在onDestroy之前被调用,我们可以利用它来进行一些数据的保存,这里我们保存TextView设置的值。

1
2
3
4
5
6
//保存Activity数据
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("textview", mTextView.getText().toString());
        super.onSaveInstanceState(outState);
    }

然后我们在重启Activity后如何得到之前保存的数据呢?这里有两种方法

1:在onCreate中

1
2
3
4
5
6
7
8
9
10
11
12
<code class="hljs 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>

可以看到,onCreate的万年不用的Bundle对象终于让我们用上了。

2:第二种方法是复写onRestoreInstanceState方法

1
2
3
4
5
6
<code class="hljs java">
      @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mTextView.setText(savedInstanceState.getString("textview"));
    }</code>

这里不需要判断Bundle对象是否为空,因为系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState()

再次运行看看效果

vcbBxLu9+NDQ0P3XqqOsQWN0aXZpdHm9+NDQz/q72dbYvai688r9vt3SwMi7tObU2jwvcD4NCjxwPtfuuvPU2b3pydy49re9t6ijrMrWtq/Iw0FjdGl2aXR5vfjQ0ND916o8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;">//设置Activity横屏显示setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置Activity竖屏显示setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

到此一些关于Android屏幕旋转的适配和常用操作技巧就介绍完了,欢迎大家在下面留言。

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【Android】11.2 通过重写对应的方法保存和恢复实例的状态
onSaveInstanceState和onRestoreInstanceState的用处...
Android VideoView Example | Examples Java Code Geeks
onWindowFocusChanged重要作用 and Activity生命周期
额外问题:onCreate中的savedInstanceState有何具体作用?具体例子?...
Android总结篇系列:Activity中几个主要函数详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服