Android设置全屏及沉浸式布局

下述代码根据 AppCompatActivity 及主题 parent="Theme.AppCompat.NoActionBar"midSdk 21实现。

对于非刘海屏幕而言有两种方式设置全屏

  1. 代码中设定,需要写在 setContentView() 之前:

    1
    2
    3
    4
    5
    6
    // 隐藏标题
    //requestWindowFeature(Window.FEATURE_NO_TITLE);
    // 设置全屏
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
    //或者是通过设置DecorView#setSystemUiVisibility(int)
    //getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN)

    需要说明一点 requestWindowFeature() 方法是指定主题为 parent="android:Theme.Black"之类的Activity 时隐藏老式 ActionBar 标题栏内容。对于继承 AppCompatActivity 这个方法无效。如果继承 AppCompatActivity 的 Activity 需要隐藏标题栏,可以通过以下方法:

    1
    2
    3
    if(getSupportActionBar()!=null){
    getSupportActionBar().hide();
    }
  2. 指定 Activity 的 Theme 主题

    1
    android:theme="@style/FullScreenTheme"

    主题设置属性:

    1
    2
    3
    4
    5
    6
    //styles.xml
    <style name="FullScreenTheme" parent="Theme.AppCompat.NoActionBar">
    //这里指定的是Appcompat主题,这个属性可以去掉
    <!--<item name="windowNoTitle">true</item>-->
    <item name="android:windowFullscreen">true</item>
    </style>

上述两种方式都可以指定非刘海屏幕全屏显示。

关于刘海屏的全屏展示。

测试机是华为8x刘海屏手机,发现设置全屏之后界面并没有延伸到刘海。刘海屏幕全屏适配分为两种情况:Android P 及Android P 一下:

  1. Android P 9.0系统提供了处理刘海屏的方法。设置全屏如下
  • 1
    2
    3
    4
    5
    6
    7
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    // 始终允许窗口延伸到屏幕短边上的刘海区域
    lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
    getWindow().setAttributes(lp);
    }
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

Android P 中新增了窗口布局参数属性 layoutInDisplayCutoutMode,共有三种模式

  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:仅当缺口区域完全包含在状态栏之中时,才允许窗口延伸到刘海区域显示
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:// 永远不允许窗口延伸到刘海区域
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES:始终允许窗口延伸到屏幕短边上的刘海区域

通过设置 setSystemUiVisibility(int) 方法可以获取实现常见的全屏或者是沉浸式布局的效果:

控制SystemBar相关:

  • SYSTEM_UI_FLAG_FULLSCREEN
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION
  • SYSTEM_UI_FLAG_LOW_PROFILE

布局相关:

  • SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  • SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  • SYSTEM_UI_FLAG_LAYOUT_STABLE

沉浸式相关 (4.4 引入):

  • SYSTEM_UI_IMMERSIVE
  • SYSTEM_UI_IMMERSIVE_STICKY

控制 SystemBar 相关

SYSTEM_UI_FLAG_FULLSCREEN

该属性是用来隐藏状态栏的,

SYSTEM_UI_HIDE_NAVIGATION

该属性是用来隐藏导航栏的

SYSTEM_UI_LOW_PROFILE

这个属性的能力是让SystemBar在视觉上变得模糊,重要性变得更低一点。具体表现是状态栏图标仅保留电量时间关键图标,并且变暗。导航栏图标变成三个点或者变暗。这个flag使用的很少。

布局相关

在新的Android4.1以及之后新的SystemUI设置里,仅单独设置隐藏状态栏和导航栏的flag会导致布局重绘,为了在显隐状态栏和导航栏的时候保持布局的稳定的显示效果,就需要以下属性了。

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

可以让布局延伸到状态栏的位置。在状态栏在隐藏和显示之前切换的时候,布局稳定的显示在状态栏后面(如果显示状态栏则布局在状态栏后面,隐藏状态栏布局也不变)。

SYSTEM_UI_FLAG_LAYOUT_STABLE

该flag的作用是保持布局稳定,避免在显隐状态栏导航栏的时候发生布局的变化。可以辅助以下SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN、SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION两个flag的使用,让应用保持全屏的情况下,布局不随状态栏导航栏显隐发生变化。也可以不配合这两个flag使用,也能达到保持布局稳定的效果,不过不能实现全屏,会留出状态栏和导航栏的位置。

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

可以让布局延伸到导航栏的位置。可以让导航栏在隐藏和显示之前切换的时候,布局稳定的显示在导航栏后面(如果显示导航栏则在导航栏后面,隐藏导航栏也不变)。

关于沉浸式界面

在代码中指定。在 setContentView() 之前指定状态栏颜色透明即可,设置状态栏透明后,界面布局将延伸到状态栏。注意如果设置全屏,状态栏不再显示.

1
2
3
4
5
6
//设置沉浸式状态栏
Window window = getWindow();
//设置状态栏颜色
window.setStatusBarColor(Color.TRANSPARENT);
//设置布局延伸到状态栏
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

对于状态栏白色的情况,在Android 6.0 sdk版本23 的情况,应如下设置:

1
2
3
4
5
6
7
8
Window window = getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.setStatusBarColor(Color.WHITE);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
//关于小米魅族状态栏颜色设置暂不考虑

参考文章:

Android沉浸式全屏讲解(状态栏、导航栏处理)

Android刘海屏适配全方案(华为、小米、Vivo、Oppo)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×