【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);
    }
相关推荐
EQ-雪梨蛋花汤1 小时前
【Part 2安卓原生360°VR播放器开发实战】第四节|安卓VR播放器性能优化与设备适配
android·性能优化·vr
每次的天空1 小时前
Android学习总结之kotlin篇(二)
android·学习·kotlin
刘洋浪子1 小时前
Android Studio中Gradle中Task列表显示不全解决方案
android·ide·android studio
橙子199110161 小时前
Kotlin 中 infix 关键字的原理和使用场景
android·开发语言·kotlin
%d%d21 小时前
undefined reference to CPUAllocatorSingleton::instance
bug
后端码匠8 小时前
MySQL 8.0安装(压缩包方式)
android·mysql·adb
梓仁沐白9 小时前
Android清单文件
android
董可伦11 小时前
Dinky 安装部署并配置提交 Flink Yarn 任务
android·adb·flink
每次的天空12 小时前
Android学习总结之Glide自定义三级缓存(面试篇)
android·学习·glide
恋猫de小郭12 小时前
如何查看项目是否支持最新 Android 16K Page Size 一文汇总
android·开发语言·javascript·kotlin