美文网首页
Android屏幕变化引起Fragment折叠的解决办法

Android屏幕变化引起Fragment折叠的解决办法

作者: CarlosLynn | 来源:发表于2019-12-12 18:03 被阅读0次

    问题现象

    奇葩问题年年有,今天又碰到一个,最近呢,在项目开发维护中遇到这样一个bug,vivo某某型号手机,三指头同时下滑,瞅瞅效果图,屏幕露出半个桌面来,而我们的应用布局发生重叠,不得不佩服我们的测试小姐姐,这样奇葩问题,你都找得到,怎么办呢,百度谷歌呗!


    image.png

    原因分析

    这样子,在当前页面的Activity中的onCreate方法中输出日志,当页面首次打开的时候有日志输出,当三个手指下滑的时候,又有日志输出,ok,到这里问题已经明朗,Activity重新创建了,显然因为生命周期方法重复执行导致它承载的Fragment出现了布局折叠问题。
    当手机屏幕变化,比如横竖屏切换,布局变化,屏幕尺寸改变等,在不经过设置时activity会被重新启动创建,而且还不止一次,而要防止这个现象的发生,就需要配置configChanges这个属性了。

    解决办法

    找到了原因,那么开始实施解决方案。
    在AndroidManifest.xml中配置configChanges这个属性如下

    <activity
        android:name=".view.activity.HomeActivity"
        android:configChanges="touchscreen|orientation|keyboardHidden|screenSize|navigation|screenLayout|layoutDirection|uiMode|fontScale|screenSize|smallestScreenSize"
        android:exported="true"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustPan" />
    

    当配置完成后,再次发布程序到手机,日志不在重复打印,页面也能够正常显示。

    configChanges属性分析:

    这样配置
    android:configChanges="orientation"
    那么横竖屏切换时就不会重新创建activity,那么这个属性到底是什么意思呢?
    首先,要了解Android默认在情况下,在系统的配置改变的情况下会重新创建activity,这个很好理解,因为系统环境变了,当然要重新创建activity来适应这个改变喽。但是在很多时候我们不想在系统配置改变时重新加载activity,那么就需要
    android:configChanges=“xxx|xxx”这个样子来搞定了。这里的xxx表这不同的系统配置的改变。
    这里的xxx包含了很多种,就像我上边写的,可以用|来连接多个值。下面简单介绍下各个值的不同含义:

    • mmc:
      这里的意思是SIM卡的标识IMSI中的mmc发生了改变,这个mmc的用途是区分不同的国家的3位数号码,比如中国的是460,玩过水货的估计有了解这个东西的。
    • mnc:
      IMSI中的运营商代码改变,就是用来区分当前SIM卡的网络运营商的,中国移动是00,联通是01,电信是03。
    • locale:
      本地位置改变触犯,恩,这个貌似跟语言切换有关,没用过,不是跟了解。
    • keyboard、keyboardHidden:
      这两个一起说一下,就是跟键盘有关的操作,前一个是键盘类型变化,如插了个键盘在设备上,后一个指的是键盘的可访问性发生变化。
    • touchScreen:
      触摸屏变化。
    • navigation:
      系统导航方式变化。
    • screenLayout:
      屏幕布局发生了改变。
    • layloutDirection:
      布局的方向发生变化,注意,是布局的方向,不是屏幕的
    • orientation:
      屏幕方向改变,具体就是屏幕的横竖屏切换。
    • uiMode:
      用户界面改变,这个是api18后出现的,比如切换夜间模式等场景会出现这个。
    • fontScale:
      系统字体大小改变。
    • screenSize:
      设备的屏幕的尺寸信息发生了改变,旋转屏幕时也会触发这个,但是这个值是API13之后才有的,因此13之前的设备没有这个。
    • smallestScreenSize:
      设备的物理屏幕发生改变,同样是API13之后的东西,指的是设备的物理屏幕发生变化,比如外接显示器之类的。。。大体上是这个意思。
      ok,回到我们的项目中把承载多个Fragment的页面Activity,统统都进行如此配置,bug完美解决!

    得瑟一下吧:

    喝饱水,闭上嘴,往前走,靠双腿。

    相关文章

      网友评论

          本文标题:Android屏幕变化引起Fragment折叠的解决办法

          本文链接:https://www.haomeiwen.com/subject/jbbtnctx.html