問題
由于業(yè)務(wù)需要,應(yīng)用需要配置沉浸式界面,但設(shè)置全屏時,會遇到異形屏采用傳統(tǒng)的全屏設(shè)置模式無效問題。
解決方案
Android P版本提供參數(shù)layoutInDisplayCutoutMode供實現(xiàn)沉浸式設(shè)置。layoutInDisplayCutoutMode幾種屬性設(shè)置:
-
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:僅當劉海屏完全包含在系統(tǒng)欄中時,才允許窗口擴展到劉海區(qū)域。 否則,窗口的布局使其不與劉海區(qū)域重疊。 -
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES:允許 Window 延伸到短的一側(cè)邊緣的劉海區(qū)域。 -
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:Window 不允許延伸到劉海屏區(qū)域。 -
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS:允許 Window 延伸到所有的屏幕邊緣劉海區(qū)域。
項目中選用shortEdges模式,直接上代碼
public final class ImmersiveUtils {
private ImmersiveUtils() {
}
/**
* 設(shè)置沉浸式模式
*/
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);
補充
實際測試中,發(fā)現(xiàn)部分高版本異形屏機型的啟動頁通過上述方式設(shè)置,仍顯示黑色的狀態(tài)欄(神奇?。。。?。
解決方案:
方法設(shè)置同時,在對應(yīng)主題進行配置,問題解決了,具體如下
<style name="AppTheme" parent="@style/Theme.AppCompat.DayNight.NoActionBar">
<item name="android:windowFullscreen">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>