【Android】【Bug】Activity全屏(保留底部按钮)被打断变成非全屏了

问题

在Activity里面设置全屏显示(保留底部按钮的全屏),刚开始的时候显示的也是全屏,但是在此页面进行一些操作之后,全屏变成非全屏了。

全屏设置方法

在 Activity 中的 onCreate 方法里,添加以下代码:

java 复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 隐藏状态栏(保留底部按钮)
     View decorView = getWindow().getDecorView();
     decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
     );
}

这样就可以显示全屏了,但是有时候会退出全屏,显示顶部的状态栏,导致页面变化。

问题原因

设置全屏模式可能会受到系统或应用其他元素的影响,导致全屏模式被临时打断。

系统 UI 状态管理

在 Android 中,全屏模式通常通过隐藏状态栏和导航栏来实现。这些 UI 元素的显示与隐藏是由系统控制的。当应用处于全屏模式时,系统会将这些栏隐藏。但是,当应用显示 Toast、对话框或其他系统提示时,这些元素可能会暂时中断全屏状态,以确保用户能够看到这些重要的系统提示信息。

1.Toast 的影响

Toast 是一种短暂的通知,通常显示在屏幕的底部。显示 Toast 时,系统会重新绘制屏幕来保证 Toast 的可见性。这可能导致全屏模式被中断,状态栏和导航栏重新出现。虽然这种情况通常是暂时的,但可能会导致全屏体验的中断。

2.对话框和弹出窗口

对话框、弹出窗口或其他系统级别的提示(如通知、权限请求)通常会覆盖应用的 UI。这些元素通常会强制重新绘制整个屏幕,包括状态栏和导航栏。这是为了确保用户能够清楚地看到这些重要的系统消息和交互元素。

3.全屏模式的持久性

为了确保全屏模式在这些系统元素影响下仍然有效,应用需要在每次返回前台时重新设置全屏状态。全屏模式的设置不是完全持久的,因为系统可能会在需要时恢复默认 UI 元素(如状态栏和导航栏)

如何确保全屏模式

1.在 onResume 中重新设置全屏:

通过在 onResume 中重新设置全屏,可以确保每次应用回到前台时都会重新应用全屏模式。

但是有时候我们会在onResume里面做一些其他操作,代码可能会看起来比较乱。

2.在onWindowFocusChanged里面设置

onWindowFocusChanged 是 Activity 中的一个生命周期方法,它在窗口的焦点状态发生变化时被调用。具体来说,当 Activity 的窗口获得或失去焦点时,这个方法会被触发。它可以用来处理以下情况:

恢复全屏模式:如果应用需要在窗口获得焦点时保持全屏,可以在这个方法中重新设置全屏模式。

更新 UI:可以在这个方法中更新 UI 元素,确保它们在获得焦点时的显示状态是正确的。

管理资源:在窗口失去焦点时,可以暂停动画或释放一些资源,节省系统资源。

所以可以这样设置

java 复制代码
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        );
        super.onWindowFocusChanged(hasFocus);
    }
相关推荐
沙尘暴炒饭1 小时前
关于uni-forms组件的bug【提交的字段[‘*‘]在数据库中并不存在】
bug
丘狸尾1 小时前
[cisco 模拟器] ftp服务器配置
android·运维·服务器
van叶~3 小时前
探索未来编程:仓颉语言的优雅设计与无限可能
android·java·数据库·仓颉
Crossoads7 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
li_liuliu8 小时前
Android4.4 在系统中添加自己的System Service
android
C4rpeDime10 小时前
自建MD5解密平台-续
android
鲤籽鲲12 小时前
C# Random 随机数 全面解析
android·java·c#
m0_5485147716 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯16 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯16 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android