Activity页面全屏探究
一些场景下需要应用全屏
1、Window设置Flag
在Activity的onCreate()方法中设置Flag:WindowManager.LayoutParams.FLAG_FULLSCREEN。了解更多Window Flag相关知识的详见《理解WindowManager》。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);2、在AndroidManifest中设置theme属性
首先在values/styles.xml中自定义theme主题,继承一个系统自带的主题。然后设置android:windowFullscreen属性为true。
<style name="AppTheme.TransparentStausBar" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowNoTitle">true</item>
//Window全屏
<item name="android:windowFullscreen">true</item>
</style>在AndroidManifest中application或者activity节点中使用自定义的android:theme
<activity android:name=".FullScreenActivity"
android:theme="@style/FullScreenTheme"/>IQOO的全屏效果如下,状态栏怎么直接黑了,不是想要的那种全屏。
可能状态栏需要另外设置,因为手机屏幕是水滴屏,屏幕正上方有一个前置摄像头。设置全屏android:windowFullscreen = false的时候,将状态栏设置成透明,有点全屏的意思了,在将状态栏隐藏就是真正的全屏!
<item name="windowNoTitle">true</item>
//设置非全屏
<item name="android:windowFullscreen">false</item>
//状态栏透明
<item name="android:windowTranslucentStatus">true</item>
随后用锤子 Smartisan M1L 调试一下,是完全可以全屏显示地,状态栏也隐藏了。

因为自定义的Activity继承自AppCompatActivity,所以只能使用Theme.AppCompat.*下的主题。如果使用了android:theme="@android:style/Theme.NoTitleBar.Fullscreen"否则会奔溃报错。提示应该使用Theme.AppCompat下的主题。
D AndroidRuntime: Shutting down VM
E AndroidRuntime: FATAL EXCEPTION: main
E AndroidRuntime: Process: com.example.androidstudio, PID: 17290
E AndroidRuntime: java.lang.RuntimeException:
Unable to start activity ComponentInfo{.androidsenCaptureActivity}:
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.


评论 (1)
水滴屏等异形屏全屏
今天又进行了摸索:
在style里面设置,下面两个属性缺一不可。更多style属性参考《Android主题Theme探究》
android:windowFullscreen属性还可以在代码中设置:
关键来了,之前设置全屏,低版本的锤子可以,高版本的IQOO就不行。因为Android后面引入的刘海屏的概念,又搞复杂了。Android P中新增了一个布局参数属性layoutInDisplayCutoutMode,包含了三种不同的模式:
该窗口决不允许与DisplayCutout区域重叠。
如果是Android API 28以后的刘海屏,需要进一步设置属性。
WindowManager.LayoutParams lp = window.getAttributes(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; } window.setAttributes(lp);这样一来在刘海屏上显示地也是全屏了:
如果不设置WindowManager.LayoutParams的layoutInDisplayCutoutMode属性值为WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,那么即使设置了android:windowFullscreen也是在刘海屏区域显示一个黑边: