【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);
    }
相关推荐
程序员清洒5 小时前
Flutter for OpenHarmony:GridView — 网格布局实现
android·前端·学习·flutter·华为
running up that hill6 小时前
Android的线性布局
android
m0_748229996 小时前
Laravel9.x核心特性全解析
android
2603_949462108 小时前
Flutter for OpenHarmony社团管理App实战:意见反馈实现
android·flutter
错把套路当深情9 小时前
android两种渠道支持一键打包 + 随意组合各种渠道
android
彬sir哥10 小时前
android studio如何把.gradle从C盘移到D盘
android·gradle·maven·android studio
、BeYourself11 小时前
TabLayout 与 ViewPager2 的基本使用
android·android-studio
南村群童欺我老无力.11 小时前
Flutter 框架跨平台鸿蒙开发 - 城市文创打卡:探索城市文化创意之旅
android·flutter·华为·harmonyos
Madison-No711 小时前
【Linux】文件操作&&重定向原理
android·linux·运维
2603_9494621012 小时前
Flutter for OpenHarmony社团管理App实战:消息中心实现
android·javascript·flutter