下述代码根据 AppCompatActivity 及主题
parent="Theme.AppCompat.NoActionBar"
和midSdk 21
实现。
对于非刘海屏幕而言有两种方式设置全屏
代码中设定,需要写在 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
3if(getSupportActionBar()!=null){
getSupportActionBar().hide();
}指定 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 一下:
- Android P 9.0系统提供了处理刘海屏的方法。设置全屏如下
1
2
3
4
5
6
7if (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 | //设置沉浸式状态栏 |
对于状态栏白色的情况,在Android 6.0 sdk版本23 的情况,应如下设置:
1 | Window window = getWindow(); |
参考文章: