Android 异形屏设备设置沉浸式界面
问题
由于业务需要,应用需要配置沉浸式界面,但设置全屏时,会遇到异形屏采用传统的全屏设置模式无效问题。
解决方案
Android P版本提供参数layoutInDisplayCutoutMode
供实现沉浸式设置。layoutInDisplayCutoutMode
几种属性设置:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
:仅当刘海屏完全包含在系统栏中时,才允许窗口扩展到刘海区域。 否则,窗口的布局使其不与刘海区域重叠。LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
:允许 Window 延伸到短的一侧边缘的刘海区域。LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
:Window 不允许延伸到刘海屏区域。LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
:允许 Window 延伸到所有的屏幕边缘刘海区域。
项目中选用shortEdges
模式,直接上代码
public final class ImmersiveUtils {private ImmersiveUtils() {}/*** 设置沉浸式模式*/public static void setImmersiveMode(Activity activity) {Window window = activity.getWindow();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {WindowManager.LayoutParams lp = window.getAttributes();lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;window.setAttributes(lp);} else {window.requestFeature(Window.FEATURE_NO_TITLE);window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);}final View decorView = window.getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);window.setStatusBarColor(Color.TRANSPARENT);}
}
在Activity
的onCreate()
方法中增加方法
ImmersiveUtils.setImmersiveMode(this);
补充
实际测试中,发现部分高版本异形屏机型的启动页通过上述方式设置,仍显示黑色的状态栏(神奇!!!)。
解决方案:
方法设置同时,在对应主题进行配置,问题解决了,具体如下
<style name="AppTheme" parent="@style/Theme.AppCompat.DayNight.NoActionBar"><item name="android:windowFullscreen">true</item><item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item></style>