问题
由于业务需要,应用需要配置沉浸式界面,但设置全屏时,会遇到异形屏采用传统的全屏设置模式无效问题。
解决方案
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>
网友评论