Activity页面全屏探究 四大组件

Quibbler 2020-2-10 1040

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.



不忘初心的阿甘
最新回复 (2)
  • Quibbler 2020-2-24
    2

    水滴屏等异形屏全屏

            今天又进行了摸索:

            在style里面设置,下面两个属性缺一不可。更多style属性参考《Android主题Theme探究》

        <item name="android:windowFullscreen">true</item>
        <item name="android:windowTranslucentStatus">true</item>

            android:windowFullscreen属性还可以在代码中设置:

        Window window = getWindow();
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);


            关键来了,之前设置全屏,低版本的锤子可以,高版本的IQOO就不行。因为Android后面引入的刘海屏的概念,又搞复杂了。Android P中新增了一个布局参数属性layoutInDisplayCutoutMode,包含了三种不同的模式

    模式模式说明
    LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT只有当DisplayCutout完全包含在系统栏中时,才允许窗口延伸到DisplayCutout区域。 否则,窗口布局不与DisplayCutout区域重叠。
    LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

    该窗口决不允许与DisplayCutout区域重叠。

    LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES该窗口始终允许延伸到屏幕短边上的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.LayoutParamslayoutInDisplayCutoutMode属性值为WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,那么即使设置了android:windowFullscreen也是在刘海屏区域显示一个黑边:


    • 安卓笔记本
      4
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com