问题
水滴屏等异形屏在启动页状态栏出现黑边的问题。
theme配置项如下
<style name="MyFullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowIsTranslucent">true</item>
</style>
方案(三种)
1、在theme中加入属性(加入之后会提示你版本问题,生成相应的style文件即可):
<!-- 水滴屏等适配展示-->
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
2、当然也可以在代码中设置
if (Build.VERSION.SDK_INT >= 28) {
val lp: WindowManager.LayoutParams = this.window.attributes
lp.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
this.window.attributes = lp
}
3、在设置沉浸式的状态下全屏的图片会自行伸入到状态栏,自己对屏幕其他按钮等进行处理即可,沉浸式的代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}
属性详解:
1、该属性有三种取值,分别为default、shortEdges、never
对应个常量值,分别为:
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1;
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;
对应的状态为:
1. 默认情况,全屏页面不可用刘海区域,非全屏页面可以进行使用
2. 允许页面延伸到刘海区域
3. 不允许使用刘海区域
2、详解源码
<attr name="windowLayoutInDisplayCutoutMode">
<!-- <p>
The window is allowed to extend into the <code>DisplayCutout</code> area, only if
the <code>DisplayCutout</code> is fully contained within a system bar. Otherwise, the
window is laid out such that it does not overlap with the <code>DisplayCutout</code>
area.
-->
<enum name="default" value="0" />
<!-- <p>
The window is always allowed to extend into the <code>DisplayCutout</code> areas on the
short edges of the screen even if fullscreen or in landscape.
The window will never extend into a <code>DisplayCutout</code> area on the long edges of
the screen.
<p>
The window must make sure that no important content overlaps with the
<code>DisplayCutout</code>.
-->
<enum name="shortEdges" value="1" />
<!-- <p>
The window is never allowed to overlap with the <code>DisplayCutout</code> area.
<p>
This should be used with windows that transiently set
<code>SYSTEM_UI_FLAG_FULLSCREEN</code> to avoid a relayout of the window when the
flag is set or cleared.
-->
<enum name="never" value="2" />
</attr>
/**
* Controls how the window is laid out if there is a {@link DisplayCutout}.
*
* <p>
* Defaults to {@link #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT}.
*
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
* @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
* @see DisplayCutout
* @see android.R.attr#windowLayoutInDisplayCutoutMode
* android:windowLayoutInDisplayCutoutMode
*/
@LayoutInDisplayCutoutMode
public int layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
/**
* The window is allowed to extend into the {@link DisplayCutout} area, only if the
* {@link DisplayCutout} is fully contained within a system bar. Otherwise, the window is
* laid out such that it does not overlap with the {@link DisplayCutout} area.
*
* <p>
* In practice, this means that if the window did not set {@link #FLAG_FULLSCREEN} or
* {@link View#SYSTEM_UI_FLAG_FULLSCREEN}, it can extend into the cutout area in portrait
* if the cutout is at the top edge. Similarly for
* {@link View#SYSTEM_UI_FLAG_HIDE_NAVIGATION} and a cutout at the bottom of the screen.
* Otherwise (i.e. fullscreen or landscape) it is laid out such that it does not overlap the
* cutout area.
*
* <p>
* The usual precautions for not overlapping with the status and navigation bar are
* sufficient for ensuring that no important content overlaps with the DisplayCutout.
*
* @see DisplayCutout
* @see WindowInsets
* @see #layoutInDisplayCutoutMode
* @see android.R.attr#windowLayoutInDisplayCutoutMode
* android:windowLayoutInDisplayCutoutMode
*/
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
/**
* The window is always allowed to extend into the {@link DisplayCutout} areas on the short
* edges of the screen.
*
* The window will never extend into a {@link DisplayCutout} area on the long edges of the
* screen.
*
* <p>
* The window must make sure that no important content overlaps with the
* {@link DisplayCutout}.
*
* <p>
* In this mode, the window extends under cutouts on the short edge of the display in both
* portrait and landscape, regardless of whether the window is hiding the system bars:<br/>
* <img src="{@docRoot}reference/android/images/display_cutout/short_edge/fullscreen_top_no_letterbox.png"
* height="720"
* alt="Screenshot of a fullscreen activity on a display with a cutout at the top edge in
* portrait, no letterbox is applied."/>
*
* <img src="{@docRoot}reference/android/images/display_cutout/short_edge/landscape_top_no_letterbox.png"
* width="720"
* alt="Screenshot of an activity on a display with a cutout at the top edge in landscape,
* no letterbox is applied."/>
*
* <p>
* A cutout in the corner is considered to be on the short edge: <br/>
* <img src="{@docRoot}reference/android/images/display_cutout/short_edge/fullscreen_corner_no_letterbox.png"
* height="720"
* alt="Screenshot of a fullscreen activity on a display with a cutout in the corner in
* portrait, no letterbox is applied."/>
*
* <p>
* On the other hand, should the cutout be on the long edge of the display, a letterbox will
* be applied such that the window does not extend into the cutout on either long edge:
* <br/>
* <img src="{@docRoot}reference/android/images/display_cutout/short_edge/portrait_side_letterbox.png"
* height="720"
* alt="Screenshot of an activity on a display with a cutout on the long edge in portrait,
* letterbox is applied."/>
*
* @see DisplayCutout
* @see WindowInsets#getDisplayCutout()
* @see #layoutInDisplayCutoutMode
* @see android.R.attr#windowLayoutInDisplayCutoutMode
* android:windowLayoutInDisplayCutoutMode
*/
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1;
/**
* The window is never allowed to overlap with the DisplayCutout area.
*
* <p>
* This should be used with windows that transiently set
* {@link View#SYSTEM_UI_FLAG_FULLSCREEN} or {@link View#SYSTEM_UI_FLAG_HIDE_NAVIGATION}
* to avoid a relayout of the window when the respective flag is set or cleared.
*
* @see DisplayCutout
* @see #layoutInDisplayCutoutMode
* @see android.R.attr#windowLayoutInDisplayCutoutMode
* android:windowLayoutInDisplayCutoutMode
*/
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;
总结
两种方案都可以解决,具体自行选择即可。