折叠屏之所以需要适配,是因为我们的应用有可能在运行的过程中,所在的屏幕尺寸发生了变化,这种情况对现有项目多少都会产生一些问题。

所以折叠屏适配的本质是:当应用运行时,屏幕的尺寸、密度或比例发生了变化,应用能够继续在变化后的屏幕上正常显示和正常运行。

其实这种情况并不是折叠屏出现之后才有的,应用的纵向横向切换也会发生同样的情况,只不过很多应用都强制纵向,不需要处理这种适配了。

/   允许改变应用尺寸   /


要适配折叠屏,首先是要让应用支持动态改变尺寸,我们需要在 manifest 中的 Application 或对应的 Activity 下声明:

android:resizeableActivity=“true”

相反,如果暂时不打算适配,把这个参数设为 false 就好了。需要说明的是,这个参数在 Android 7.0 或更高版本默认为 true,以下则默认为 false。

下面介绍两个和这个参数相关的概念。

/   分屏模式   /

之所以从 Android 7.0 开始,把 resizeableActivity 默认改为 true,是因为在 7.0 里增加了一个新功能,叫分屏模式。

android 监听折叠屏折叠状态变化 安卓 折叠_面试

如果把 resizeableActivity 设为 false,就意味着应用是不支持分屏模式的,它决定了应用是否有分屏的设置项。

android 监听折叠屏折叠状态变化 安卓 折叠_Android_02

/   兼容模式   /

当 resizeableActivity 取 false 时,展开折叠屏可能会变成这样的效果:

android 监听折叠屏折叠状态变化 安卓 折叠_android_03

这个效果类似于在 iPad 上使用不兼容的 iPhone 应用,这个四周用黑色填充的模式,叫兼容模式。

兼容模式的显示和最大支持比例 maxAspectRatio 有关,当屏幕比例超过 maxAspectRatio 时才会用黑边填充,官方建议把  maxAspectRatio 设为 2.4 (12 : 5),修改 maxAspectRatio 的方法如下:

Android 8.0 或以上版本

在  标签中配置 android:maxAspectRatio:

<activity android:name=“.MainActivity”

android:maxAspectRatio=“2.4” />

Android 8.0 以下版本

在 标签中添加名为 android.max_aspect 的 meta-data:

如果 resizeableActivity 设为 true,就不需要设置 maxAspectRatio 了,设了也不会生效。

/   监听尺寸改变   /

在默认情况下,当屏幕发生了变化,系统会销毁并重新创建整个 Activity。但我们希望屏幕变化之后,程序能够以切换前的状态继续运行,不需要重启页面。

我们可以给 Activity 添加配置:

android:configChanges=“screenSize|smallestScreenSize|screenLayout”

这样配置后,当屏幕发生变化就不会重启 Activity 了,会调用到 onConfigurationChanged 方法,我们可以在这个方法里获取到当前的屏幕信息:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i(“config”, “newConfig.screenHeightDp:” + newConfig.screenHeightDp
• “, newConfig.screenWidthDp” + newConfig.screenWidthDp);
}

这样改之后需要注意测试,看看页面的布局是否发生错乱,如果布局不合理就需要修改布局以适配不同分辨率。

我们也可以根据屏幕信息来更新布局,比如在大屏幕上把 LinearLayout 切换成 GridLayout,充分利用大屏幕的显示空间,这是更进一步的优化做法了:

android 监听折叠屏折叠状态变化 安卓 折叠_android_04